为什么".*"和".+"给出不同的结果?
System.out.println("foo".replaceAll(".+", "bar")); // --> "bar"
System.out.println("foo".replaceAll(".*", "bar")); //--> "barbar"
Run Code Online (Sandbox Code Playgroud)
我希望两者都是"bar",因为*和+都是贪婪的,应该匹配整个String.(以上示例是Java,但其他工具,如http://www.gskinner.com/RegExr/给我相同的结果)
Meh*_*ari 12
你是贪婪但是".*"匹配两个字符串是对的:第一个是"foo"第二个,第二个是"".".+"只会匹配"foo".
两者都试图匹配最长的字符串"foo".之后,他们尝试找到上一场比赛后最长的匹配字符串.在这个阶段,".*"能够匹配空字符串,而".+"不是.
Mehrdad已经解释过它还匹配字符串末尾的一个空子字符串.我在.net文档中找到了这种行为的官方解释(为什么匹配一个空子字符串而不是无限数字):
http://msdn.microsoft.com/en-us/library/c878ftxe.aspx
当最小数量n匹配时,量词*,+,{n,m}(和它们的"懒惰"对应物)在空匹配后永远不会重复.当m为无穷大时,此规则可防止量词在空匹配上进入无限循环(尽管规则适用,即使m不是无穷大).
例如,(a?)*匹配字符串"aaa"并捕获模式(a)(a)(a)()中的子字符串.请注意,没有第五个空捕获,因为第四个空捕获导致量词停止重复.
| 归档时间: |
|
| 查看次数: |
337 次 |
| 最近记录: |