javascript - 如何使用正则表达式提取布尔运算符,后跟单词,直到下一个运算符?
问题描述
我正在尝试组合一个相对简单的表达式,用于从用户输入中提取布尔字符串运算符(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) .*?$
解决方案
您也可以使用否定的前瞻来断言之后的单词字符,所以不要以任何一种替代方式开头
\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);
推荐阅读
- java - 合并多个 Spring JPA Page 对象结果
- python - 我想在按钮单击时更新我的框架和饼图
- java - 应用程序打开时如何以编程方式恢复位置访问
- sql - 如何执行存储在表中的 SQL 查询
- google-apps-script - 如何从表单中获取仅电子邮件项目的列表?
- java - 如何使用java将jmeter jtl httpSample/httpSample子值替换为父值
- javascript - JS ES6 中的动态变量访问
- c# - 覆盖 RSA 对象中的默认算法以支持 OaepSHA256 填充
- python - ImportError:将 apache_beam 导入为梁。未找到模块
- jetty - Jetty 9.x 的 Connectors 中的 Connection 对象去哪儿了?