否定前瞻性正则表达式忽略单词列表

时间:2013-05-11 15:49:56

标签: regex

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

我在搜索类似的问题后尝试了一个负面的预测,这是我现在的正则表达式:(?!AND|OR|NOT).*?\\s

如果我用“AND”尝试这个,我会在“ND”上得到一个匹配。如果我尝试“或”,我会得到“R”,如果我尝试“不”,我会得到“OT”。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:5)

尝试使用此模式:

\\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|$)))

  • 不是和或没有你想要的所有词语:

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

答案 1 :(得分:3)

嗯,如果我理解正确的话,我不是百分之百确定,但你可以尝试一下,看看它是不是你在找什么?

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

这将与评论中的XYZ匹配(但前面有白色字符)。我在中间添加了一个单词后测试了它here

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

\w+$

或:

[^\s]+$