Javascript 在文本中查找准确的单词,不包括引用的单词

Javascript 在文本中查找准确的单词,不包括引用的单词,javascript,regex,Javascript,Regex,在下面的javascript代码中,我需要在文本中找到精确的单词,但不包括引号之间的单词。这是我的尝试,正则表达式怎么了?它应该找到所有不包括word22和“word3”的单词。如果我在正则表达式中只使用\b,它会选择精确的单词,但不会排除引号之间的单词 var text = 'word1, word2, word22, "word3" and word4'; var words = [ 'word1', 'word2', 'word3' , 'word4' ]; words.forEach(f

在下面的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);
});

您对引号字符的排除是错误的,它实际上与字符串开头后跟引号相匹配。试试这个

var re = new RegExp('\\b[^"]' + word + '[^"]\\b', 'i');
此外,该网站还可以帮助您调试正则表达式:

编辑:因为
\b
将匹配引号,所以需要进一步调整。不幸的是,javascript不支持lookbehinds,所以我们必须有点技巧

var re = new RegExp('(?:^|[^"\\w])' + word + '(?:$|[^"\\w])','i')
所以这是在说什么

(?:         Don't capture this group
^ | [^"\w]) either match the start of the line, or any non word (alphanumeric and underscore) character that isn't a quote
word        capture and match your word here
(?:         Don't capture this group either
$|[^"\w)    either match the end of the line, or any non word character that isn't a quote again

首先,我们将使用一个函数来转义单词的字符,以防有一些字符对regexp有特殊意义

// from https://stackoverflow.com/a/30851002/240443
function regExpEscape(literal_string) {
    return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
编辑:事实上,如果我们考虑到周围的条件,我们可以加快regexp的速度:

let regexp = new RegExp(
  '\\b(?:' + 
  words.map(regExpEscape).join('|') + 
  ')\\b(?=(?:[^"]*"[^"]*")*[^"]*$)', 'g')

如果搜索
word2
,只有当字符串包含
bword2e
或类似内容时,才会找到它,因为“nota quote”断言的宽度不是空的,并且每个断言都必须使用一个字符。由于javascript不支持lookbehinds,这有点麻烦,但是看看这个更新对你是否有效@ps0604这可能是更好的解决方案,因为它平衡了一些引用。我的不匹配类似于
“word2
word2”
的东西,它以引号开头或结尾,但不被引号包围。
let regexp = new RegExp(
  '\\b(?:' + 
  words.map(regExpEscape).join('|') + 
  ')\\b(?=(?:[^"]*"[^"]*")*[^"]*$)', 'g')