北木 发表于 2014-7-3 11:39
不重复单词的提取
\b(\w+)\b(?!.*?\b\1\b)
这个怎么理解好的呢?.不能匹配\n,"?!."不就是匹配\n么?
...
\b(\w+)\b(?!.*?\b\1\b)
每当\b(\w+)\b匹配到一个单词后,正则尝试(?!.*?\b\1\b),如果它报告失败,表明后面有相同单词出现,于是整个匹配失败;反之,表明后面没有相同单词出现,整个匹配成功.并将结果保存在匹配集合中.
.*?\b\1\b 子表达式是接着在前面单词后的位置上尝试有无\1,即前面相同单词.如果有,(?!...)部分报告失败,反之报告成功.
该正则表达式只能在同一行中查找,如果要跨行,可以把句点改为[\s\S]
你给出的正则对每一个单词来说都会成功,如将之作用于文本"abc abc",它的匹配过程是:
\b(\w+)\b成功匹配第一个abc,马上检查\b\1\b部分,由于第一个abc后是空格,所以不能与\1匹配,于是(?!...)报告成功,整个匹配完成.对其它位置上的单词匹配情况一样.注意(.*?)部分事实上不会匹配任何文本,因为?是忽略优先的,除非它后面的(?!...)部分报告失败,它才会开始匹配文本.
要理解上述解释,建议参考本文的原理部分. |