如何在正则表达式中反转积极的lookbehind(?< =)?

时间:2016-02-13 15:11:43

标签: java regex groovy

当我使用时:

String s = "http://google.com, /home/roroco/Dropbox/jvs/ro-idea/META-INF/plugin.xml"
ArrayList<String> ms = s.findAll(/(?<=\/)\/\S+/)
println(ms)

输出结果为:

[/google.com,]

当我改为:

s.findAll(/(?<!\/)\/\S+/)

输出结果为:

[//google.com,, /home/roroco/Dropbox/jvs/ro-idea/META-INF/plugin.xml]

根据我的理解,/(?<!\/)\/\S+/输出应与/(?<=\b)\/\S+/输出相同,但实际上并非如此。为什么?

2 个答案:

答案 0 :(得分:1)

关于你的问题。结果不能相同。看:

(?<!/)/\S+表示find the place where "/" standing before "/" and give me this "/" with all non-whitespace character after it。只有一个地方。

结果将是:/google.com,

您的字符串中没有其他地方"/"字符位于"/"

之前

(?<=\b)\/\S+表示find the place where word boundary standing before "/" and give me this "/" and all non-whitespace character after it

结果将是:/roroco/Dropbox/jvs/ro-idea/META-INF/plugin.xml

在这种情况下,单词"e"的字母"home"和字符"/"本身将被识别为单词边界。

前言:

(?<=)是积极的后顾之忧。它会检查字符串中当前位置之前的内容。例如:

(?<=foo)bar表示select 'bar', if 'foo' standing before

(?<!)是负面的后卫。它会检查不会在当前位置之前的内容。例如:

(?<!foo)bar表示select 'bar', if 'foo' does NOT standing before

\b表示单词边界。它匹配一侧是单词字符而另一侧不是单词的位置。例如:

(?<=\b)bar表示select 'bar', if word boundary standing before"foo bar"字符串中搜索将返回"bar",因为字词之间的空格。但是"foobar"将不会返回任何内容,因为最后一个字符串中的单词之间没有空格,因此"bar"之前没有单词边界。

答案 1 :(得分:0)

detectChanges()将与\/\S+匹配,因此//google.com无意义