javascript - 查找文本中的确切单词,不包括引用的单词

标签 javascript regex

在下面的 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/

相关文章:

Javascript:操作系统检测……如果在 Linux 上

javascript - 在 Angular js文件中获取未定义的php值

javascript - 在 JavaScript 中从字符串的开头到结尾删除 HTML 内容组

python - 如何使用正则表达式提取文档/文本中的所有引号?

php - 使用 javascript、PHP、MySQL 进行 html 表单处理时的安全预防措施

Python 正则表达式提取日期

regex - 从 Unix 中的一行中提取字符串

javascript - 离开网站时弹出窗口

javascript - 如何等待异步调用在 foreach 循环 JavaScript 中执行?

javascript - 为什么 HTML DOM 事件不会立即影响同一个 DOM 元素?