You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则匹配前后带下划线的字符串并统计其出现次数

问题原因分析

原来的正则用了\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:15:05