首页 > 解决方案 > 如何使用正则表达式提取布尔运算符,后跟单词,直到下一个运算符?

问题描述

我正在尝试组合一个相对简单的表达式,用于从用户输入中提取布尔字符串运算符(AND、OR、NOT 等),结果匹配的数组将包含单词和前面的运算符,直到下一个运算符:

const query = 'lorem AND ipsum dolor OR fizz NOT buzz';

结果应该是这样的:

[
 ['AND', 'ipsum dolor'],
 ['OR', 'fizz'],
 ['NOT', 'buzz']
]

我创建了这个用于在每个运算符之后获取单个单词,这很好:

^(\w+\s?)+?|(AND) (\w+)|(OR) (\w+)|(NOT) (\w+)

然后尝试修改它以在运算符之后处理多个单词以获得上述结果,但它总是贪婪并捕获整个字符串输入:

(AND|OR|NOT) (\w+\s?)+ (?:AND|OR|NOT)

更新

我想通了,但我不确定它有多漂亮或高效:

^(\w+)|(AND|OR|NOT) (.*?(?= AND|OR|NOT))|(AND|OR|NOT) .*?$

标签: javascriptregexbooleanoperators

解决方案


您也可以使用否定的前瞻来断言之后的单词字符,所以不要以任何一种替代方式开头

\b(AND|OR|NOT) ((?!AND|OR|NOT)\b\w+(?: (?!AND|OR|NOT)\w+)*)

正则表达式演示

const regex = /\b(AND|OR|NOT) ((?!AND|OR|NOT)\b\w+(?: (?!AND|OR|NOT)\w+)*)/gm;
const str = `lorem AND ipsum dolor OR fizz NOT buzz`;
let m;
let result = [];
while ((m = regex.exec(str)) !== null) {
  result.push([m[1], m[2]]);
}
console.log(result);


推荐阅读