【问题标题】:Regex - Match any word but ignore specific word [duplicate]正则表达式 - 匹配任何单词但忽略特定单词[重复]
【发布时间】:2018-01-02 15:46:46
【问题描述】:

我想匹配任何开始/结束或不包含单词“end”但忽略单词“end”的单词,例如:

  • 你好 - 会匹配
  • 男朋友 - 会匹配
  • 无穷无尽 - 会匹配
  • endend - 将匹配

但是

  • 结束 - 会匹配

我正在使用^(?!end)).*$,但这不是我想要的。

对不起我的英语

【问题讨论】:

  • 等等。您只想排除“结束”这个词本身?其余的都应该匹配吗?
  • 是的,先生,这可能吗?

标签: regex


【解决方案1】:

试试这个:

^(?!(end)$).+$

这将匹配除 end 之外的所有内容。

【讨论】:

  • 只是一个修改。您应该使用.+ 而不是.*。因为.* 将匹配零宽度。
  • @Rahul 好点.. 感谢您的通知
  • @downvoter 一个理由会很好。
  • 巨大!如果你想排除 2 个单词 ==> ^(?!(word1|word2)$).+$
【解决方案2】:

所以你想匹配任何单词,而不是“end”?

除非我有误解,否则条件语句就是所需要的一切......在伪代码中:

if (word != "end") {
    // Match
}

如果您想匹配 text 中所有不是“end”的单词,您可以删除所有非字母字符,将模式 (^end | end | end$) 替换为空字符串,然后进行字符串拆分。 使用单个正则表达式的其他答案可能会更好,因为regex matches are O(n),无论模式如何。

【讨论】:

    【解决方案3】:

    你可以用这个\b(?!(?:end\b))[\w]+

    组件: \b -> 每个单词的单词边界的开始。 (?! 否定前瞻来消除end这个词。 (?:end\b) 带有单词结尾和单词边界的非捕获括号。 ) 负前瞻的结束标记。 [\w]+ 字符类捕捉单词。

    说明:正则表达式搜索将仅查找以单词边界开头的位置,并将删除仅以单词结尾的匹配项。即[WORD BOUNDARY]end[END OF WORD BOUNDARY]\w 将捕获单词的其余部分。如果您希望捕获一些特殊字符,例如 $ 等,您可以不断增加此字符类。

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 1970-01-01
      • 2019-09-25
      • 2013-06-10
      • 2013-06-16
      • 2014-06-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      相关资源
      最近更新 更多