[英]Regular expression boundary matchers for beginning of line (^) and end of line ($) not working
[英]Why does regular expression not match without boundary matcher "Beginning of line"?
Java 的正則表達式中有一些我不明白的地方。 我有以下字符串(我需要“截止日期”):
From Date :01/11/2011 To Date :30/11/2011;;;;;;;;;;;;;
我認為以下正則表達式(在 Perl 中)會匹配。
to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4})
在 Java 中,此模式不匹配。 但是,如果我在前面和末尾添加一個.+
,它就會起作用 所以這個模式適用於 Java:
Pattern p = Pattern.compile(".+to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}).+", Pattern.CASE_INSENSITIVE);
我不明白的是:如果我在行尾添加^
(行首)和$
,我會很清楚第一個模式在 Java 中不匹配。 這意味着,模式必須匹配整行。 但是如果沒有它,第一個模式實際上應該匹配,因為如果我不在前面和末尾設置分隔符,為什么模式關心這個模式的 scope 之外的字符串數據? 這對我來說不合邏輯。 在我看來,第一個模式的行為應該類似於字符串 class 的“包含”方法。我認為在 Perl 中也是如此。
在 Java 中, matches()
驗證整個字符串。 您的輸入可能有換行符(與.+
不匹配)。
試試這個:
Pattern p = Pattern.compile(".+to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}).+", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("... \n From Date :01/11/2011 To Date :30/11/2011;;;;;;;;;;;;; \n ...");
System.out.println(m.matches()); // prints false
if(m.find()) {
System.out.println(m.group(1)); // prints 30/11/2011
}
使用find()
時,您可以從模式中刪除.+
:
Pattern.compile("to\\s+date\\s*?:\\s*?([0-9]{2}[./][0-9]{2}[./][0-9]{2,4})", Pattern.CASE_INSENSITIVE);
(無需轉義字符 class 中的.
,順便說一句)
我認為這個來自不同問題的答案也回答了你的問題:為什么 Java 和 Perl 中的正則表達式表現不同?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.