为了重现最近一个问题中所述的问题 -为什么 (.*)* 进行两次匹配并且在组 $1 中不选择任何内容?我尝试了括号内外的 and 的各种组合,结果出乎我的*
意料。+
我本来期望输出与该问题中已接受的答案中解释的输出相同,并且在另一个重复的问题中,标记为Perl
-为什么 .* 不消耗此 Perl 正则表达式中的整个字符串?. 但它的行为方式并不相同。
为简单起见,这是我尝试过的代码:-
String str = "input";
String[] patterns = { "(.*)*", "(.*)+", "(.+)*", "(.+)+" };
for (String pattern: patterns) {
Matcher matcher = Pattern.compile(pattern).matcher(str);
while (matcher.find()) {
System.out.print("'" + matcher.group(1) + "' : '" + matcher.start() + "'" + "\t");
}
System.out.println();
}
这是我得到的所有 4 个组合的输出:-
'' : '0' '' : '5' // For `(.*)*`
'' : '0' '' : '5' // For `(.*)+`
'input' : '0' 'null' : '5' // For `(.+)*`
'input' : '0' // For `(.+)+`
现在,我无法理解,为什么输入1st
和输出,2nd
我没有得到整个字符串first result
。matcher.find()
我的意思是,理想情况下,在第一种情况下,.*
应该首先捕获整个字符串,然后empty string
在最后捕获。现在,虽然它在第二场比赛中给出了预期的结果,但它的表现并不好1st match
。
而且,在第二种情况下,我什至不应该得到第二场比赛,因为我+
在括号外有一个量词。
我的预期输出是: -
'input' : '0' '' : '5' // For 1st
'input' : '0' // For 2nd
另外,在3rd
输出中,为什么我得到了null
第二场比赛而不是empty string
?前三个组合的第二场比赛不应该相同吗?
第四个输出符合预期。所以,毫无疑问。