JS Regex:完全匹配短语列表(包括哈希符号)

时间:2016-10-04 02:27:06

标签: javascript 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因为我不想包含子字符串,而是包含完整的字词/短语,即 "富"不应该与" foobar"匹配,但应匹配"我喜欢foo"

这很有用,但是,字边界\b会忽略以#开头的短语,因为\b会以字母数字字符开始边界。

所以,如果" #hashtag"在数组中,只有在被测试的字符串具有"#标签"而不是" #hashtag"

时才会匹配

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

有人能指出我正确的方向吗?感谢。

1 个答案:

答案 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#'-])/