这是一个只是为了满足我的好奇心的问题。请考虑以下两个Java正则表达式:[, !.]
和[, !.]+?
。它们是等价的吗?我试图提出他们不相同的例子,但我找不到。
编辑: 我理解为了匹配整个String,它们不是等价的。但是当你使用它们在字符串中找到子串的多个匹配时,它们似乎与我相同。
答案 0 :(得分:3)
这是同一个String
中的一个自包含示例,因为你的角色类贪婪,不情愿或没有量词匹配。
Pattern greedy = Pattern.compile("[, !.]+");
Pattern reluctant = Pattern.compile("[, !.]+?");
Pattern nonQuantified = Pattern.compile("[, !.]");
String example = "foo !! bar";
Matcher greedyMatcher = greedy.matcher(example);
Matcher reluctantMatcher = reluctant.matcher(example);
Matcher nonQMatcher = nonQuantified.matcher(example);
while (greedyMatcher.find()) {
System.out.printf("Greedy found: %s%n", greedyMatcher.group());
}
while (reluctantMatcher.find()) {
System.out.printf("Reluctant found: %s%n", reluctantMatcher.group());
}
while (nonQMatcher.find()) {
System.out.printf("Non-quantified found: %s%n", nonQMatcher.group());
}
<强>输出强>
Greedy found: !!
Reluctant found:
Reluctant found: !
Reluctant found: !
Reluctant found:
Non-quantified found:
Non-quantified found: !
Non-quantified found: !
Non-quantified found:
<强>解释强>
find
一次返回true
,group()
凝固整场比赛find
每次匹配都会返回true
一次&#34;示例&#34; String
和group
,已调用4次,返回一个空格,一个!
,另一个!
和最后一个空格Pattern
上的官方API,对量词语法很有用注意强>
[, !.]+
,而不是你问题中的非量化[, !.]
答案 1 :(得分:2)
当您将{strong> 与Matcher.find()
一起使用时,它们是等效的。
[, !.]+?
,在匹配所需的一次重复之后,将尝试续集(在这种情况下,它是模式的结尾,因此它是接受节点) ,并返回单个字符匹配。
因此,当与[, !.]
一起使用时,它在逻辑上与Matcher.find()
相同。
由于量词的懒惰,只有在续集失败时才会尝试更多的重复,如果你在其后添加其他东西,或者使用带有Matcher.matches()
的正则表达式(仅接受当你到达字符串的末尾时匹配。)