正则表达式对非捕获组懒惰

Regex lazy on non-capturing group

我有这个正则表达式:

(?:(?:AND\sNOT|AND|OR)(?!.*(?:AND\sNOT|AND|OR))\s)(.*)

我想要的是得到最后的key:value对,例子-

k:v AND k1:v1 AND NOT k2:v2 OR k3:v3

我希望正则表达式匹配 k3:v3,它的确如此, 但在下一种情况下它与 key:value 不匹配 -

k:v

我需要它来匹配 key:value 对,即使它是第一个并且之前没有运算符...

更新:key:value 不是这里的问题,我需要它来匹配最后一个运算符

之后的所有内容

更新 2:尝试执行以下操作 -

(?:(?:AND\sNOT|AND|OR)?(?!.*(?:AND\sNOT|AND|OR))\s)(.*)
(?:(?:AND\sNOT|AND|OR?)(?!.*(?:AND\sNOT|AND|OR))\s)(.*)

没用

根据您的解释,您根本不需要第一个运算符。只需尝试

(?!.*(?:NOT|AND|OR)\s)(\b.*)

更新

根据评论,我假设您需要匹配最后的 key:value 对及其运算符(如果有的话),以及之后的任何内容:

(?:.*\b(AND(?:\sNOT)?|OR) +)?(\S+:\S+.*)

Live demo


您需要的可以简化为:

(?:AND(?:\sNOT)?|OR)\s+(\S+)$

Live demo

  • (?:AND(?:\sNOT)?|OR) 匹配 ANDAND NOTOR
  • \s+ 匹配任意数量的空格
  • (\S+) 匹配并捕获 none-whitespace 个字符
  • $ 断言字符串结束

编辑 - 糟糕,JS 不支持 \K。这是另一种选择:

/(?:.*(?:AND|OR|NOT)\s+)?(.*)/(第 1 组)

https://regex101.com/r/AyVV89/3(请检查右侧面板上的匹配项,由于某些原因第 1 组未在文本中突出显示。)

原版post

根据您的上次更新(在您提到它之前根本不明显):

key:value is not the issue here, I need it to match everything after the last operator

这个将匹配最后一个运算符之后的任何内容,无论它是什么(并且也可以在没有运算符的情况下工作):

/(?:.*(?:AND|OR|NOT)\s+\K)?.*/

https://regex101.com/r/AyVV89/2