【问题标题】:Why does regular expression not match without boundary matcher "Beginning of line"?为什么没有边界匹配器“行首”的正则表达式不匹配?
【发布时间】:2012-04-04 07:08:42
【问题描述】:

Java 的正则表达式中有一些我不理解的东西。我有以下字符串(我需要“to Date”):

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 中将不匹配。这意味着,模式必须匹配整行。但是没有它,第一个模式实际上应该匹配,因为如果我没有在前面和最后设置分隔符,为什么模式会关心超出此模式范围的字符串数据?这对我来说不合逻辑。在我看来,第一个模式的行为应该类似于 String 类的“包含”方法。我认为在 Perl 中也是如此。

【问题讨论】:

  • 您可以在 regexplanet 测试 Java 正则表达式。我什至无法让您的模式在其中使用 .+ 。

标签: java regex pattern-matching


【解决方案1】:

在 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);

(不需要在字符类中转义 .,顺便说一句)

【讨论】:

  • 好的,“找到”就是诀窍。顺便说一句:你说得对,我可以省略字符类中的转义字符,不知道。
【解决方案2】:

我认为这个来自不同问题的答案也回答了你的问题:Why do regular expressions in Java and Perl act differently?

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多