理解占有量词,java正则表达式
我理解一个正面的正则表达式会到达文本的末尾,并且不会回溯以查看在结束之前是否存在匹配。 如果最后有一个匹配则返回true,否则它会立即返回false。 我踩过这个:
Pattern patt = Pattern.compile(".*+foo"); Matcher matcher = patt.matcher("xxfooxxxxxfooxxxfoo"); while (matcher.find()) System.out.println(matcher.group());
即使最后有一场比赛,它也没有给我任何帮助。 有什么想法吗?
另外我理解为了使正则表达式懒惰/占有欲我在第一个量词之后添加?/ +(即*?或* +)。 是对的吗? 谢谢!
即使最后有一场比赛,它也没有给我任何帮助。 有什么想法吗?
.*+
将匹配整个输入字符串(包括最后一个foo
)。 并且因为它不会从字符串的末尾回溯,所以正则表达式.*+foo
不匹配。
另外我理解为了使正则表达式懒惰/占有欲我在第一个量词之后添加?/ +(即*?或* +)。 是对的吗?
占有欲的反面部分并不是懒惰的。 这将是贪婪的,默认情况下是*
。
因此,正则表达式.*?foo
将匹配"xxfoo"
,而正则表达式.*foo
将匹配"xxfooxxxxxfooxxxfoo"
。
占有量词不会放弃回溯的匹配。 .*+
匹配你的整个字符串然后foo
没有匹配。
呃,像巴特说的那样。 🙂
只有当你知道你匹配的东西永远不会被回溯时才使用占有量词(例如, [^f]*+.*foo
或者,如果你知道唯一的“f”字符将在“foo”的开头, [^f]*+foo
)。
- 通过Windows客户端中的注册表设置java
- EJB 3.1容器管理并发与同步
- Java 7 Calendar.getInstance,TimeZone.getTimeZone得到同步和缓慢,任何解决方法?
- C ++“对象”类
- ServletContext是每个Web应用程序一个还是每个JVM一个?
- 使用redis进行Spring启动缓存,密钥有\ xac \ xed \ x00 \ x05t \ x00 \ x06
- .foreach和.stream()之间的区别是什么?foreach?
- 配置Apache HttpClient通过代理/负载均衡器访问服务(覆盖主机头)
- 如何从Javascript调用GWT java函数?