在下面的 javascript 代码中,我需要在文本中找到确切的词,但排除引号之间的词。这是我的尝试,正则表达式有什么问题?它应该找到除 word22
和 "word3"
之外的所有单词。如果我在正则表达式中仅使用 \b
,它会选择准确的词,但不会排除引号之间的词。
var text = 'word1, word2, word22, "word3" and word4';
var words = [ 'word1', 'word2', 'word3' , 'word4' ];
words.forEach(function(word){
var re = new RegExp('\\b^"' + word + '^"\\b', 'i');
var pos = text.search(re);
if (pos > -1)
alert(word + " found in position " + pos);
});
最佳答案
首先,我们将使用一个函数来转义单词的字符,以防万一某些对正则表达式有特殊含义的字符。
// from https://stackoverflow.com/a/30851002/240443
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
然后,我们构造一个正则表达式作为单个单词正则表达式之间的交替。对于每个单词,我们断言它以单词边界开始,以单词边界结束,并且在其末尾和字符串末尾之间有偶数个引号字符。 (请注意,从 word3
的末尾开始,到 string 的末尾只有一个引号,这是奇数。)
let text = 'word1, word2, word22, "word3" and word4';
let words = [ 'word1', 'word2', 'word3' , 'word4' ];
let regexp = new RegExp(words.map(word =>
'\\b' + regExpEscape(word) + '\\b(?=(?:[^"]*"[^"]*")*[^"]*$)').join('|'), 'g')
text.match(regexp)
// => word1, word2, word4
while ((m = regexp.exec(text))) {
console.log(m[0], m.index);
}
// word1 0
// word2 7
// word4 34
编辑:实际上,如果我们考虑到周围的条件,我们可以稍微加快正则表达式的速度:
let regexp = new RegExp(
'\\b(?:' +
words.map(regExpEscape).join('|') +
')\\b(?=(?:[^"]*"[^"]*")*[^"]*$)', 'g')
关于javascript - 查找文本中的确切单词,不包括引用的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53511629/