我有一系列短语,我试图检测一串文字是否包含完整的短语。我目前正在使用以下正则表达式:
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
因为我不想包含子字符串,而是包含完整的字词/短语,即
"富"不应该与" foobar"匹配,但应匹配"我喜欢foo"
这很有用,但是,字边界\b
会忽略以#
开头的短语,因为\b
会以字母数字字符开始边界。
所以,如果" #hashtag"在数组中,只有在被测试的字符串具有"#标签"而不是" #hashtag"
时才会匹配我真正想要的是一个与数组中指定的整个短语匹配的正则表达式,包括符号和散列。或者也许是一个可以解决这个问题的解决方案。
有人能指出我正确的方向吗?感谢。
答案 0 :(得分:1)
不幸的是,JS没有lookbehind,因此如果不将该字符包含在匹配中,则无法匹配前一个字符的属性(\b
除外,正如您所注意到的那样,使用非常有限) )。如果你可以接受,你可以:
/(?:^|\W)(foo|bar|foo bar|#hashtag)(?=$|\W)/
并且只处理第一个捕获组。如果您只想要完整的单词/短语,则保证不会重叠,因为保证是非单词分隔符。
注意:如果arrOfWords
包含带有正则表达式字符的字符串,则它们将被解释为;因此foo.bar
将匹配foosbar
。请参考here了解如何避免它。
嘿,这对我来说是90%,谢谢。只是为了挑剔,我注意到如果arrOfWords
包含#hashtag
,它将与字符串中的##hashtag
匹配。只有在哈希数准确的情况下才有匹配的方法吗?
然后你需要明确一个单词是什么以及什么是非单词字符,然后将\W
替换为。{/ p>
/(?:^|[^\w#'-])(foo|bar|foo bar|#hashtag)(?=$|[^\w#'-])/