【问题标题】:Match list of words without the list of chars around匹配没有字符列表的单词列表
【发布时间】:2014-02-22 06:18:37
【问题描述】:

我有这个正则表达式

(?:$|^| )(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 int 第三行也是如此。

实时示例:http://regex101.com/r/hV3wQ3

我认为这与不匹配组的号码有关。但是,我不确定如何实现匹配所有单词列表且周围没有任何字符的最终目标。

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

【问题讨论】:

    标签: regex pattern-matching regex-group


    【解决方案1】:

    由于您的捕获组在常用词的任一侧明确定义了一个字符,因此它正在寻找 space word space,然后当它没有找到另一个 space 时,它会失败。

    在这种情况下,由于您不想匹配单词边界会捕获的所有字符(句点、撇号等),因此您需要对前瞻、后瞻和非捕获组使用一些技巧。试试这个:

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

    http://regex101.com/r/cM9hD8

    字边界实现起来还是比较简单的,所以为了参考,你也可以这样做(虽然它会包括'.等)。

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

    【讨论】:

    • 我已经更新了问题。这就是我不使用单词边界的原因。它匹配word'wordone's
    • 好吧,这是有道理的——在这种情况下,我已经用一个新的表达式和链接为你更新了答案。
    • 就可以了。很棒的一个。谢谢
    【解决方案2】:

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

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

    检查DEMO

    【讨论】:

    • 我不想匹配one's。这就是为什么我不使用 \b
    • 现在问题是 word'word 被匹配。 :(
    • 如果单词彼此相邻则不起作用。它匹配common word 中的common,但不匹配word。 Remus 的回答完全可以做到这一点。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多