String.raw 用于获取原始字符串,避免 JavaScript 解析反斜杠转义,使正则表达式书写“所见即所得”;它支持多行模板和注释(配合 x 标志),但不处理插值,动态内容需单独转义。

String.raw 是 JavaScript 中专门用于获取原始字符串(即不处理任何反斜杠转义)的工具,特别适合构建含大量反斜杠的正则表达式模板,避免手动重复转义带来的错误和可读性问题。
为什么正则表达式里需要 String.raw
正则表达式本身依赖反斜杠(\)表示特殊含义,比如 \d 匹配数字、\s 匹配空白。而在普通字符串字面量中,反斜杠又是 JS 的转义字符——这意味着写 "\d" 实际只传给正则引擎一个 d;而要表示真正的 \\d(即正则中的 \d),就得写成 "\\d",极易出错且难以维护。
String.raw 绕过 JS 层级的转义解析,让每个 都原样保留,使正则模式与你“所见即所得”地一致。
基本用法:替代冗长的双反斜杠
对比以下两种写法:
- 传统方式(易错):const re = new RegExp("\\d+\.\\d+", "g"); —— 要写四个反斜杠才能得到正则里的两个
- String.raw 方式(清晰):const re = new RegExp(String.raw`d+.d+`, "g"); —— 所见即所得,点号和反斜杠都按正则语法直写
注意:模板字符串中使用反引号 `,且 必须是模板字面量(哪怕没有插值),不能用普通引号。
构建多行、带注释的正则模板
复杂正则常需分段编写和逻辑说明。String.raw 支持多行模板字符串,配合正则的 x 标志(忽略空白和注释),可大幅提升可读性:
const emailPattern = String.raw`
^ # 开头
[a-zA-Z0-9._%+-]+ # 用户名部分
@ # @ 符号
[a-zA-Z0-9.-]+ # 域名主体
. # 字面量点号(需转义)
[a-zA-Z]{2,} # 顶级域
$ # 结尾
`;
const re = new RegExp(emailPattern, "gx"); // 注意加 x 标志
这样写的正则既保留换行缩进,又可通过注释说明每段作用,String.raw 确保所有 .、^、$ 等符号不被 JS 解析干扰。
结合变量动态插入时的注意事项
String.raw 本身不支持插值(${...})的转义控制——它只禁用转义,但变量内容仍可能含反斜杠。若需拼接动态片段,建议:
- 对用户输入或外部变量先做安全转义(如用 escapeRegExp() 函数处理特殊字符)
- 把固定结构用 String.raw 写死,动态部分单独拼接并确保已转义
- 例如:const pattern = String.raw`` + escapeRegExp(keyword) + String.raw``;

















