Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么正则表达式在没有边界匹配器的情况下不匹配;行的开头“;?_Java_Regex_Pattern Matching - Fatal编程技术网

Java 为什么正则表达式在没有边界匹配器的情况下不匹配;行的开头“;?

Java 为什么正则表达式在没有边界匹配器的情况下不匹配;行的开头“;?,java,regex,pattern-matching,Java,Regex,Pattern Matching,在Java的正则表达式中有一些我不理解的东西。我有以下字符串(我需要“截止日期”): 我认为下面的正则表达式(在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

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

我认为下面的正则表达式(在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类的“contains”方法。我认为Perl就是这样。

在Java中,
匹配()
验证整个字符串。您的输入可能有换行符(与
+
不匹配)

请尝试以下方法:

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);
(顺便说一句,无需转义字符类中的

在Java中,
匹配()
验证整个字符串。您的输入可能有换行符(与
+
不匹配)

请尝试以下方法:

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

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

我认为这个来自不同问题的答案也回答了您的问题:

我认为这个来自不同问题的答案也回答了您的问题:

您可以在测试Java regexp。我甚至无法让您的模式在其中使用.+。您可以在测试Java regexp。我甚至无法让您的模式在其中使用.+。好的,“查找”就是诀窍。顺便说一句:你是对的,我可以省略字符类中的转义字符,我不知道。好的,“查找”就是诀窍。顺便说一句:你是对的,我可以省略字符类中的转义字符,我不知道。