簡體   English   中英

為什么沒有邊界匹配器“行首”的正則表達式不匹配?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM