1

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 中,此模式不匹配。但是如果我在前面和最后添加 a 就可以了.+ 所以这种模式在 Java 中有效:

Pattern p = Pattern.compile(".+to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}).+", Pattern.CASE_INSENSITIVE);

^我不明白的是:如果我在行尾添加 a (行首)和 a ,我很清楚第一个模式在 Java 中将不匹配$。这意味着,模式必须匹配整行。但是没有它,第一个模式实际上应该匹配,因为如果我没有在前面和最后设置分隔符,为什么模式会关心超出此模式范围的字符串数据?这对我来说不合逻辑。在我看来,第一个模式的行为应该类似于 String 类的“包含”方法。我认为在 Perl 中也是如此。

4

2 回答 2

6

在 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(),您可以.+从模式中删除 's:

Pattern.compile("to\\s+date\\s*?:\\s*?([0-9]{2}[./][0-9]{2}[./][0-9]{2,4})", Pattern.CASE_INSENSITIVE);

(无需转义.字符类内部,顺便说一句)

于 2012-04-04T07:14:43.550 回答
0

我认为这个来自不同问题的答案也回答了您的问题:为什么 Java 和 Perl 中的正则表达式行为不同?

于 2012-04-04T07:19:17.183 回答