当我使用时:
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+/
输出相同,但实际上并非如此。为什么?
答案 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
无意义