正则表达式对非捕获组懒惰
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+.*)
您需要的可以简化为:
(?:AND(?:\sNOT)?|OR)\s+(\S+)$
(?:AND(?:\sNOT)?|OR)
匹配 AND
或 AND NOT
或 OR
\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)?.*/
我有这个正则表达式:
(?:(?: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+.*)
您需要的可以简化为:
(?:AND(?:\sNOT)?|OR)\s+(\S+)$
(?:AND(?:\sNOT)?|OR)
匹配AND
或AND NOT
或OR
\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)?.*/