17370845950

javascript正则表达式如何使用_有哪些常用模式【教程】
匹配字面量下划线\_需写\\\_,因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 字母 —— 这未必是你想要的。

如果你只想要下划线(比如校验用户名只允许字母、数字、下划线),别偷懒用 \\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 RegEx

p("\_") 就错了 —— 因为字符串解析阶段就崩了。只要涉及动态生成正则(比如拼接变量),优先用 new RegExp(escapeForRegex(str)) 或直接避免正则,改用 includes()indexOf()split() 等原生方法。