匹配字面量下划线_需写\_,因JS字符串中是转义符,正则引擎需接收\_;等价写法为/\_/或new RegExp("\_");用[a-zA-Z0-9_]比w更安全精准。

JavaScript 正则表达式本身不“使用_”,而是用 \(两个反斜杠)来匹配字面量的下划线 _。这是初学者最常卡住的地方:写 _ 不起作用,写 _ 报错,真正该写的是 \_。
为什么匹配 _ 要写 \_?
因为 JavaScript 字符串里, 是转义字符。正则表达式引擎看到的原始模式,必须是字面量 _;而要让字符串中出现这个 _,就得在 JS 里写成 "\_"(第一个 转义第二个 ,最终传给 RegExp 的是单个 _)。
等价写法:new RegExp("\_") 或字面量 /\_/ —— 后者更常用,且无需双重转义。
- 错误写法:
/_/→ 实际匹配任意字符(_在正则里不是特殊字符,但这里没问题);真正危险的是想匹配字面量却漏掉反斜杠 - 更常见错误:
/_/→ 语法报错,因为_不是合法转义序列 - 正确写法:
/\_/或new RegExp("\_")
\w 和 [a-zA-Z0-9_] 都能匹配下划线,但有区别
\w 确实包含下划线,但它还匹配 ASCII 字母、数字,且在某些正则标志(如 u)下可能扩展为 Unicode 字母 —— 这未必是你想要的。
立即学习“Java免费学习笔记(深入)”;
如果你只想要下划线(比如校验用户名只允许字母、数字、下划线),别偷懒用 \w,显式写出字符集更安全:
/^[a-zA-Z0-9_]+$/
-
/\w+/可能意外匹配到带重音符号的字母(启用u标志时) -
/[a-zA-Z0-9_]+/行为确定,无歧义 - 注意开头结尾的
^和$,否则"abc_def"里"_def"也会被部分匹配
替换字符串里的 _ 时,别忘了 g 标志
用 replace() 全局替换下划线,必须加 g,否则只换第一个:
"a_b_c".replace(/\_/g, "-") // → "a-b-c"
- 漏掉
g:结果是"a-b_c"(只替换了第一个) - 如果用字符串作为搜索值:
"a_b_c".replace("_", "-"),也只换第一个 —— 这是String.prototype.replace的默认行为 - 想批量处理,要么用正则加
g,要么用split("_").join("-")(更直观,无正则开销)
真正容易被忽略的,是正则字面量和字符串构造器对反斜杠的处理差异:写 /\_/ 是对的,但写 new RegExp("_") 就错了 —— 因为字符串解析阶段就崩了。只要涉及动态生成正则(比如拼接变量),优先用 new RegExp(escapeForRegex(str)) 或直接避免正则,改用 includes()、indexOf()、split() 等原生方法。











