【问题标题】:Make this regex code apply to words with an apostrophe将此正则表达式代码应用于带有撇号的单词
【发布时间】:2020-09-26 01:52:46
【问题描述】:

我使用此代码在单词两侧选择 2 个单词。

((\w+\W+){0,2}WORDHERE(\W+\w+){0,2})

但它将撇号分隔的单词视为“两个单词”。

例如,输入文本:

你不是 WORDHERE 是最好的

最差的 WORDHERE 肯定没赢

结果是:

你不是 WORDHERE 是最好的

最差的 WORDHERE 肯定没有赢

如何让这段代码理解带撇号的单词应该被视为一个单词?

【问题讨论】:

    标签: php regex preg-replace preg-match


    【解决方案1】:

    在您使用的模式中,[^\s\r\n]+ 匹配除空格或换行符以外的任何字符,也可能匹配 ''''

    如果您想匹配撇号不在开头或结尾的撇号分隔的单词,您可以使用:

    (?:\w+(?:'\w+)? ){0,2}WORDHERE(?: \w+(?:'\w+)?){0,2}
    

    说明

    • (?:非捕获组
      • \w+(?:'\w+)? 匹配 1+ 个单词字符,可选匹配 ' 和 1+ 个单词字符后跟一个空格
    • ){0,2}关闭组并重复0-2次
    • WORDHERE 字面上匹配
    • (?:非捕获组
      • \w+(?:'\w+)?和上一个模式一样,只是空格现在在开头
    • ){0,2}关闭组并重复0-2次

    Regex demo

    【讨论】:

    • 这个例子的问题是它捕获了围绕原始单词的无限单词。在 Regex 演示中,如果您在任一侧添加单词,它会继续捕获它们。我正在寻找一种方法来设置两边的字数。
    • @Joe 在这种情况下,您可以使用量词 (?:\w+(?:'\w+)? ){0,2}WORDHERE(?: \w+(?:'\w+)?){0,2} regex101.com/r/C6yFXR/1
    • 真是个聪明人,非常感谢您抽出宝贵的时间!此代码似乎比我在下面发布的代码更好,因为它理解不选择例如 HTML 代码。我测试并且“不要停止> WORDHERE now here”没有选择开头(这很好)。再次感谢!
    【解决方案2】:

    似乎我设法通过使用 SO 上的另一个正则表达式代码解决了这个问题:

    (?:[^\s\r\n]+[\s\r\n]+[^\s\r\n]*){0,2}WORDHERE(?:[^\s\r\n]*[\s\r\n]+[^\s\r\n]+){0,2}
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      相关资源
      最近更新 更多