如何编写正则匹配前后带下划线的字符串并统计其出现次数
问题原因分析
原来的正则用了\b单词边界匹配规则,该规则仅在单词字符(含字母、数字、下划线)和非单词字符的交界位置触发匹配。因为下划线属于单词字符,所以test和下划线相邻时,\b不会匹配,导致带前后下划线的目标子串无法被识别。
修复方案
我们可以用负向断言替代原生\b,自定义边界规则:目标子串的前后不能出现其他字母(保留原代码大小写不敏感的匹配规则),即可覆盖下划线、符号、标签、连接符等所有相邻场景。
修改后的代码如下:
function countOccurences(string, word) { // 用负向前后断言替代\b,限定目标子串前后不能有其他字母 var regex = new RegExp("(?<![a-z])" + word + "(?![a-z])", "gi"); return (string.match(regex) || []).length; } var str = "TEST Testing TeSt case-test case@test <h1>Test</h1> www.test.com TEST_UF_3780_nix_inputs r_test regex-test_"; var asset = "test"; console.log(countOccurences(str, asset));
优化补充
如果要匹配的word可能包含正则特殊字符(比如.、*、+等),可以先对word做转义处理,避免正则解析错误:
// 正则特殊字符转义函数 function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } // 构造正则前先转义目标词 var regex = new RegExp("(?<![a-z])" + escapeRegExp(word) + "(?![a-z])", "gi");
匹配效果说明
修改后可正确识别所有需求场景的test,同时不会误匹配前后带其他字母的内容(比如Testing里的test不会被统计):
- 独立的全大写/小写/混合大小写
test - 前后带下划线:
TEST_UF、r_test、regex-test_ - 前后带符号:
case-test、case@test、www.test.com - 包裹在HTML标签内:
<h1>Test</h1>
内容的提问来源于stack exchange,提问作者s_guha96
相关产品推荐
相关产品推荐

