我有以下句子: 测试或或测试
我需要检测第一个 OR 并且不将其包含在引号中。输出应该是这样的:
“测试”或“或测试”
可能是多个OR|NOT|AND,输出应该是相同的。现在我只能检测到“或”,所以输出是“测试”或“测试”,但我需要它是“测试”或“或测试”
const testItem = item => {
if (item.match(/\b(?:AND|OR|NOT)\b/g) !== null) {
return item.replace(/([a-zA-Z]+)/gi, (word) => {
if (['AND', 'OR', 'NOT'].indexOf(word) < 0) return `"${word}"`;
return word;
});
}
}
console.log(testItem("Test OR OR OR OR OR Test"))
输出应该是“测试”或“OR OR OR OR OR测试”
最佳答案
您可以使用以下正则表达式:
(.*?)(\s+(?:AND|OR|NOT)\s+)(.*)
(.*?)
- 匹配尽可能少的内容并将其放入第一个捕获组(\s+(?:AND|OR|NOT)\s+)
- 匹配由一个或多个空白字符包围的 AND/OR/NOT 并将其放入第二个捕获组(.*)
- 匹配字符串的其余部分并将其放入第三个捕获组中。
现在您可以用三个捕获组替换字符串并包围第一个和最后一个组:
const testItem = item => item.replace(/(.*?)(\s+(?:AND|OR|NOT)\s+)(.*)/, '"$1"$2"$3"');
console.log(testItem("Test OR OR Test"));
console.log(testItem("Test AND OR Test"));
console.log(testItem("Test OR OR OR OR OR Test"));
关于javascript - 如果有多个 AND、OR、NOT,则将句子拆分为引用的短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59821357/