JS Regex:精确匹配短语列表(包括散列符号)



我有一个短语数组,我试图检测文本字符串是否包含完整的短语。我目前正在使用以下正则表达式:

var arrOfWords = ['foo', 'bar', 'foo bar']
var regEx = new RegExp('\b(' + arrOfWords.join('|') + ')\b', 'gi')
console.log(regEx)
/b(foo|bar|foo bar)b/gi

我使用b是因为我不想包含子字符串,而是完整的单词/短语,即。"foo"不应该与"foobar"匹配,而应该与"I like foo"匹配

这工作得很好,但是,单词边界b忽略以#开头的短语,因为b从字母数字字符开始边界。

所以如果"#hashtag"在数组中,它只会匹配被测试字符串的"hashtag",而不是"#hashtag"

我真正要找的是一个匹配数组中指定的整个短语的正则表达式,包括符号和哈希。或者也许有一个解决方案可以解决这个问题。

谁能给我指个正确的方向?谢谢。

不幸的是,JS没有向后看,所以不可能匹配前一个字符的属性,而不包括该字符到匹配中(除了b,这是,正如你注意到的,非常有限的使用)。如果您可以接受,您可以:

/(?:^|W)(foo|bar|foo bar|#hashtag)(?=$|W)/

,只处理第一个捕获组。如果你只想要完整的单词/短语,这保证不会重叠,因为保证有一个非单词分隔符。

注意:如果arrOfWords包含具有regexp意义的字符串,它们将被解释为;所以foo.bar将匹配foosbar。参考这里如何避免它。

嘿,这是我的90%,谢谢。只是吹毛求疵,我注意到,如果arrOfWords包含#hashtag,它将与字符串中的##hashtag匹配。是否有一种方法可以匹配只有当哈希数是准确的?

那么您需要明确什么是单词,什么是非单词字符,并将其替换为W

/(?:^|[^w#'-])(foo|bar|foo bar|#hashtag)(?=$|[^w#'-])/

相关内容

最新更新