我正在尝试使用 JavaScript 和正则表达式突出显示一组关键字,我遇到了一个问题,我的关键字可能包含文字和特殊字符,如 @text #number 等。我正在使用单词边界来匹配和替换整个单词而不是部分单词(包含在另一个单词中)。
var pattern = new regex('\b '( + keyword +')\b',gi);
这里这个表达式匹配整个关键字并突出显示它们,但是以防万一像“number:”这样的关键字没有被突出显示。
我知道 \bword\b
单词边界和特殊字符的匹配项是非字母数字字符,因此与上述表达式不匹配。
你能告诉我可以使用什么正则表达式来完成上述任务吗?
==更新==
对于上面的内容,我尝试了 Tim Pietzcker 对以下正则表达式的建议,
expr: (?:^|\\b|\\s)(" + keyword + ")(?:$|\\b|\\s)
上面的内容似乎是为了让我用字母数字和非字母数字字符匹配整个单词,但是只要关键字在关键字之前或之后有连续的 html 标签而没有空格,它就不会突出显示该关键字(例如社会保障*号码:
*)
我尝试了以下正则表达式,但它替换了关键字
expr: (?:^|\b|\s|<[^>]+>)number:(?:$|\b|\s|<[^>]+>)
这里是关键字number:,它有< br >
(有意为 br 标签添加空格以避免浏览器解释标签)接下来没有空格的关键字会突出显示。
您能否建议一个表达式,该表达式将忽略包含字母数字和非字母数字字符的整个单词的连续 html 标记。
最佳答案
2021 更新:JS 现在支持后视所以这个答案有点过时了。
好的,所以你有两个问题:JavaScript 不支持 lookbehind,\b
只能找到字母数字和非字母数字字符之间的边界。
第一个问题: 究竟是什么构成了您的关键字的词边界?我的猜测是它必须是 \b
边界或空白。如果是这样,您可以搜索
"(?:^|\\b|\\s)(" + keyword + ")(?:$|\\b|\\s)"
当然,像 @number#
这样的关键字周围的空白字符也会成为匹配的一部分,但也许突出显示这些不是问题。在其他情况下,我。 e.如果存在可以匹配的实际单词边界,则空格不会成为匹配的一部分,因此在大多数情况下它应该可以正常工作。
您感兴趣的实际词会在反向引用 #1 中,所以如果您能单独突出显示它,那就更好了。
编辑: 如果除空格之外的其他字符可能出现在关键字之后/之前,那么我认为您唯一可以做的事情(如果您坚持使用 JavaScript)是:
- 检查您的关键字是否以字母数字开头。
- 如果是这样,请将
\b
添加到您的正则表达式中。 - 检查您的关键字是否以字母结尾。
- 如果是这样,请将
\b
附加到您的正则表达式中。
因此,对于关键字
,使用\bkeyword\b
;对于 number:
,使用 \bnumber:
;对于 @twitter
,使用 @twitter\b
。
关于javascript - 正则表达式使用单词边界匹配 javascript 中的字母数字和非字母数字字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4215468/