【问题标题】:How to negate whole words in regex [duplicate]如何在正则表达式中否定整个单词[重复]
【发布时间】:2021-01-23 09:13:26
【问题描述】:

我已经使用了一点正则表达式,但现在我偶然发现了一种情况,我真的不知道该怎么做,而且我阅读的所有在线教程都没有涵盖我的情况。 这个问题看起来很容易解决,而且可能很容易解决,但我还没有找到解决方案。

我需要解析一个字符串,它由短字符串与布尔运算符 AND、OR 和 NOT 组合而成,允许使用括号,空格无关紧要,不区分大小写。

例如

xxxx AND  (yyyy or zzzz) and not  qqqq

现在我想找出前面有 NOT 的所有字符串。为此,我创建了这个正则表达式模式

"NOT\s+[\w]+"

(文字 NOT 后跟至少一个空格,后跟至少一个字母/数字。)

在上面的例子中,这会给我“不是 qqqq”。

但是,如果用户碰巧写了

xxxx AND  (yyyy or zzzz) and not not  qqqq

这是一个有效的字符串,那么我的模式会给我“not not”而不是“not qqqq”。

所以我需要一个正则表达式模式,它会给我“字面词不后跟空格,后跟任何字符串,但不跟空格(或字符串结尾)”。

我知道如何否定单个字符,但我没有找到任何否定整个单词的工作示例,至少在我在 regexstorm.net 中进行测试时没有找到

我使用 .NET。

【问题讨论】:

  • 我会说,分析它的正确方法是捕获整个not not qqqq,否则你在某处悬空not
  • 请注意,您可能拥有 aaa xxx 而不是(yyy 或 zzz)
  • 是的,我知道,我想一个一个地捕捉术语并用占位符替换它们,直到我只剩下简单的术语。所以,当字符串是“not not qqqq”时,我会先捕获“not qqqq”并用占位符替换它,给我“not ”,然后下一个匹配会给我“not "。

标签: .net regex


【解决方案1】:

使用不区分大小写的匹配,您可以使用

\bNOT\s+(?!NOT\b)\w+
  • \bNOT\s+ 一个单词边界,匹配 NOT 和 1+ 个空白字符
  • (?!NOT\b) Negativelookahead,断言 NOT 不在右边
  • \w+匹配1+单词字符

Regex demo

【讨论】:

    猜你喜欢
    • 2014-07-06
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2011-02-07
    相关资源
    最近更新 更多