不带字符列表的单词匹配

30

我有这个正则表达式

(?:$|^| )(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

我认为这与非匹配组的数量有关。但是,我不确定如何达到匹配所有单词列表的最终目标,而没有任何字符围绕它们。

我不想匹配one's中的oneword'word中的单词。

2个回答

61

由于您的捕获组明确定义了公共单词两侧的一个字符,因此它正在寻找空格 单词 空格,然后当它找不到另一个空格时,它就会失败。

在这种情况下,由于您不想匹配所有单词边界会捕获的字符(句点、撇号等),您需要使用一些巧妙的技巧,例如前瞻、后顾和非捕获组。请尝试以下内容:

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

http://regex101.com/r/cM9hD8

为了参考而言,单词边界仍然更容易实现,因此您也可以这样做(尽管它将包括'.等)。

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

我已经更新了问题。这就是我不使用单词边界的原因。它匹配word'wordone's - San
1
好的,明白了 - 那么我已经为您更新了答案,并提供了一个新的表达和链接。 - brandonscript
完成了任务。太棒了。谢谢。 - San

4

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

它不会匹配 one's, someone等等...

检查演示


我不想匹配 one's。这就是为什么我不使用 \b。 - San
现在的问题是匹配到了 word'word。:( - San
如果这些单词挨在一起,它就无法工作。它会匹配common word中的common,但不会匹配word。Remus的答案完美地完成了这项工作。感谢您的建议。 - San

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接