2014-01-30 31 views
8

我有这样的正则表达式匹配列表周围

(?:$|^|)(one|common|word|or|another)(?:$|^|) 

除非这两个词是彼此相邻相匹配的罚款。

One one's more word'word common word or another word more another 

More and more years to match one or more other strings 

And common word things and or 

在上面它匹配两线one但不是or只是在它旁边。第三行为commonword

活生生的例子:http://regex101.com/r/hV3wQ3

我相信这件事情做不匹配的群体数量。但是,我不知道如何实现匹配所有没有任何字符的单词列表的最终目标。

我不希望oneone's或单词word'word匹配。

回答

19

由于您的捕捉组明确一个字符定义的常用字的两边,它在寻找spacewordspace,然后当它没有找到另一space,它失败。

在这种情况下,由于您不希望匹配所有字符(边界,撇号等)会捕获的字符,因此您需要对预览,后向追踪和非捕获组使用一些技巧。试试这个:

(?:^|(?<=))(one|common|word|or|another)(?:(?=)|$) 

http://regex101.com/r/cM9hD8

字边界仍然容易实现,所以对于参考,你也可以做到这一点(虽然这将包括'.等)。

\b(one|common|word|or|another)\b 
+0

我已经更新的问题。这就是我不使用文字边界的原因。它匹配'word'word'和'one's'。 – San

+1

好吧,这是有道理的 - 在这种情况下,我已经用新的表达式和链接更新了答案。 – brandonscript

+0

完成这项工作。好的。谢谢 – San

1

您可以使用(?:[\s]|^)(one|common|word|or|another)(?=[\s]|$)代替。

它不会匹配one'ssomeone,等...

检查DEMO

+0

我不想匹配'one's'。这就是为什么我不使用\ b – San

+0

我更新了我的答案。 –

+0

现在问题是'word'word'被匹配。 :( – San