【问题标题】:Regular expression to match strings that do NOT contain all specified elements正则表达式匹配不包含所有指定元素的字符串
【发布时间】:2021-02-23 04:56:54
【问题描述】:

我想找到一个与不包含所有指定元素的字符串匹配的正则表达式,与它们的顺序无关。例如,给定以下数据:

one two three four
one three two
one two
one three
four

将单词two three 传递给正则表达式应该匹配one twoone threefour 行。

我知道如何实现一个表达式来匹配不包含任何单词的行,只匹配行four

^((?!two|three).)*$

但是对于我所描述的情况,我迷路了。

【问题讨论】:

  • @JvdV 它不能同时包含两个词,只要其中一个就可以了
  • 另外,^(?!.*\b(two|three)\b.*\b(?!\1)(two|three)\b).* should work。三个单词的扩展将look like this

标签: regex regex-lookarounds regex-negation


【解决方案1】:

好问题。看起来您正在寻找一些 AND 逻辑。我相信有人可以想出更好的东西,但我想到了两种方法:

^(?=(?!.*\btwo\b)|(?!.*\bthree\b)).*$

在线查看demo

或者:

^(?=.*\btwo\b)(?=.*\bthree\b)(*SKIP)(*F)|^.*$

在线查看demo

在这两种情况下,我们都使用正向前瞻来模拟AND 逻辑,以防止两个单词出现在文本中,而不管它们在完整字符串中的位置如何。如果只有其中一个词存在,则字符串将通过。

【讨论】:

    【解决方案2】:

    使用这种模式:

    (?!.*two.*three|.*three.*two)^.*$

    Demo

    【讨论】:

    • two four不匹配
    • 谢谢,我接受了@JvdV 的回答,因为它可以应用于两个以上的单词
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2011-05-02
    • 2017-10-02
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多