【问题标题】:Negative lookahead regex to ignore list of words负前瞻正则表达式忽略单词列表
【发布时间】:2026-02-22 21:45:01
【问题描述】:

我正在尝试编写一个正则表达式,只要该单词不是ANDORNOT,它就会找到后面跟着空格的任何单词。

在搜索类似问题后,我尝试了否定前瞻,这是我当前的正则表达式:(?!AND|OR|NOT).*?\\s

如果我用“AND”尝试这个,我会在“ND”上得到匹配。如果我尝试使用“OR”,我会得到“R”,如果我尝试使用“NOT”,我会得到“OT”。

谁能帮忙?

【问题讨论】:

  • 试试这个 -- (?!(AND|OR|NOT)).*\s
  • 在那里尝试过,但在第一个字符之后仍然返回匹配项。
  • 我们能看到你要匹配的字符串吗?这是什么语言?
  • 我是在 C# 中做的。我正在尝试解析发送给我的查询。一个例子是: Name:The "Special" One AND XYZ 我有另一个查询获取名称参数。 XYZ 是默认字段的值,因此它在发送时没有任何分隔符,因此我需要在不获取 AND 的情况下获取它。不确定这是否有意义:)

标签: regex


【解决方案1】:

试试这个模式:

\\b(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+\\s

我添加了一些单词边界 (\b) 并使用了字符类 [a-zA-Z](您可以在不区分大小写的上下文中将其替换为 [a-z])以避免惰性量词。

或更高性能(不区分大小写):

\\b(?>(?>[b-mp-z])|(?!(?>and|or|not)\\b)[aon])(?>[a-z]*)\\s

如果你想匹配:

  • 双引号之间没有双引号或空格的单词:

(?<=(\"?)\\b)(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+(?=\\1(?:\\s|$))

  • 双引号和双引号之间的单词:

(\"?)(?<=\\b)(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+\\1(?=\\s|$)

  • 括号之间没有括号的单词:

(?<=(\\()\\b)(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+(?=(?(1)\\)|(?:\\s|$)))

  • 括号和双引号之间的单词没有两者:

(?<=(\\()?(\"?)\\b)(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+(?=(?(1)\\)|\\2(?:\\s|$)))

  • 不是 AND OR NOT 的单词没有你想要的所有东西:

\\b(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+\\b

【讨论】:

  • 这似乎有效,但我需要它来匹配 " 和 ( 例如名称:"特殊" One AND "XYZ" 我将查询更改为:\\b(?!( ?:AND|OR|NOT)\\b)[a-zA-Z\\\\"]+\\s (添加在末尾的 \\\" 中)但它只捕获单词中的最后一个 " 例如特殊的“和 XYZ”。有什么建议吗?
  • @user2367873:你想捕捉双引号之间的单词,但是你想用双引号还是不用双引号来捕捉它们?
  • 我想我现在有了,我添加了一个 \"?(? 在开头捕获任何引号或括号并更改结尾部分以捕获任何内容。基本上我正在尝试解析一个具有不同可能性的查询。我有 2 个正则表达式来捕捉前两个可能性,而这个正则表达式是为了得到不是其中一个关键字的任何东西。我现在的查询:\"?(?\b(?!(?:AND| OR|NOT)\b).+?\\s 我认为这将捕获 0-1 " 或 ( 在开始时然后边界不给出 AND|OR|NOT 然后在空格之前不贪婪。这听起来对吗?
  • @user2367873:我重申我的问题:你的结果中需要"XYZ" 还是XYZ
  • 对不起,我想要“XYZ”基本上想要捕捉任何不是 AND、OR、NOT 的东西。
【解决方案2】:

嗯,我不能 100% 确定我是否理解正确,但你能试试这个,看看它是否是你要找的吗?

(?<=\bAND|\bOR|\bNOT)\s.*

这将匹配您评论中的XYZ(尽管前面带有白色字符)。我在中间加了一个词后测试了here

编辑:如果右侧没有更多字符并且您需要最后三个字符,则可以使用以下任一字符:

\w+$

或:

[^\s]+$

【讨论】:

  • 所以这只会匹配 AND OR NOT 后面的单词?对吗,这是一个积极的回顾?我认为在这种情况下(其中一个单词是第一位的)它有效,但如果不是,则无效。我需要它来匹配任何不是它们的单词,所以它可能类似于: Name:Test IBM 我有另一个表达式正在获取 Name:Test。我需要这个来把 IBM 弄到这里来。我有几个表达式,每个都有不同的情况,这个是捕捉剩下的东西,但不是这 3 个关键字。
  • 等等,我刚刚意识到……右边还有更多字符吗?如果没有,您可以使用简单的[^\s]+$\w+$
  • 是的,不幸的是可能有:/我开始认为有一种更简单的方法可以做到这一点,但@Casimir 上面的回答让我现在有了一个工作版本。谢谢您的帮助!我需要进一步研究我的正则表达式!
  • 好的。祝你好运! ^^ 我也会努力学习的。我不认为我能想出像 Casimir 那样的正则表达式,但 xD