作者:王功争_781 | 来源:互联网 | 2023-09-18 15:33
我想知道在Java中使用匹配器的行为.我有一个已编译的模式,当运行匹配器的结果时,我不明白为什么缺少特定值.我的代码:Stringstrstarwars;PatternpPat
我想知道在Java中使用匹配器的行为.
我有一个已编译的模式,当运行匹配器的结果时,我不明白为什么缺少特定值.
我的代码:
String str = "star wars";
Pattern p = Pattern.compile("star war|Star War|Starwars|star wars|star wars|pirates of the caribbean|long strage trip|drone|snatched (2017)");
Matcher matcher = p.matcher(str);
while (matcher.find()) {
System.out.println("\nRegex : " matcher.group());
}
我受到“星球大战”的打击,这是正确的,就像我的模式一样.
但是我没有受到“星球大战”的热捧,我也不明白为什么这是我的模式的一部分.
解决方法:
这种行为是可以预料的,因为NFA regex中的alternation是“渴望的”,即第一场比赛获胜,而其余的选择都没有经过测试.另外,请注意,一旦正则表达式引擎在使用模式中找到匹配项(您的模式是使用模式,则它不是像先行/后退/单词边界/锚那样的零宽度断言),索引将前进到末尾匹配,然后从该位置搜索下一个匹配.
因此,一旦第一个星球大战替代分支匹配,就无法匹配星球大战,因为正则表达式索引位于最后一个s之前.
只要检查字符串是否包含要检查的字符串,最简单的方法就是循环:
String str = "star wars";
String[] arr = {"star war","Star War","Starwars","star wars","pirates of the caribbean","long strage trip","drone","snatched (2017)"};
for(String s: arr){
if(str.contains(s))
System.out.println(s);
}
见Java demo
顺便说一下,您的正则表达式包含snatched(2017),并且不匹配(和),仅匹配snatched2017.要匹配文字括号,必须对(和)进行转义.我还删除了有关“星球大战”的虚假条目.