如何编写正则匹配非前后接字母数字的关键词(含特殊前缀)
HTML高亮特殊字符关键词的正则解决方案
问题核心
原高亮函数使用\b单词边界匹配关键词,无法处理以&TEXT这类特殊字符开头的关键词——因为\b仅在字母数字/下划线(\w)与非字母数字(\W)的边界生效,特殊字符开头的关键词在字符串首尾或非\w字符前时,\b无法匹配对应位置。
解决方案:负向环视正则
使用负向零宽断言替代\b,可以精准匹配「前后不紧跟字母数字/下划线」的关键词,同时兼容字符串首尾的场景:
- 先转义关键词中的正则特殊字符(避免
&、*等字符破坏正则结构) - 用
(?<!\w)(后行断言:前面不是\w)和(?!\w)(先行断言:后面不是\w)定义匹配边界
修改后的完整函数
// 转义正则特殊字符的工具函数 function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } function _highlight(input, keyword, colour) { var escapedKeyword = escapeRegExp(keyword); // 负向环视确保关键词前后不是字母数字/下划线 var regex = "(?<!\\w)(" + escapedKeyword + ")(?!\\w)"; var r = new RegExp(regex, "g"); return input.replace(r, "<span style=\"color: " + colour + ";\">$1</span>"); }
为什么之前的尝试失效?
- 第一种正则
(\.*[^0-9A-Za-z_]+)(keyword)([^0-9A-Za-z_]+\.*):强制要求关键词前后存在非字母数字字符,导致字符串首尾的关键词无法匹配。 - 第二种正则
(\B)(keyword)(\b):\B是非单词边界,仅匹配\w与\w、\W与\W之间的位置,普通字母数字关键词的首尾边界(\b)无法被匹配。
扩展支持Unicode字符
如果需要匹配中文、日文等Unicode字母/数字,可将\w替换为Unicode属性类,同时开启u标志:
function _highlight(input, keyword, colour) { var escapedKeyword = escapeRegExp(keyword); // 匹配Unicode字母、数字、下划线之外的边界 var regex = "(?<![\\p{L}\\p{N}_])(" + escapedKeyword + ")(?![\\p{L}\\p{N}_])"; var r = new RegExp(regex, "gu"); return input.replace(r, "<span style=\"color: " + colour + ";\">$1</span>"); }
内容的提问来源于stack exchange,提问作者brownandrew15
相关产品推荐
相关产品推荐

