使用方法
- 文本框已服务端直出一段示例
price: $19.99 (50% off),打开页面即可看到转义结果,不必先输入;脚本只在该框为空时回填示例。 - 「模式」决定转义口径:模式外按 15 个特殊字符逐个加反斜杠;字符类内只处理
]、\、^、-四个,其余字符原样保留,并自动补上外层方括号。 - 「方向」选择转义或反转义。反转义按相反规则去掉转义反斜杠,用于把已经处理过的串还原成原始字面量。
- 按 Ctrl(Mac 上是 Command)+ Enter 触发;文本框里的 Enter 留给换行,不会误触发。
- 结果区给出转义后的字符串、原串长度、结果长度与本次发生变化的字符数。
- 下方「逐字符明细」列出每个输入字符与它在当前模式下的输出形态;行数多时可点「加载更多」,也可用 TSV 复制或导出带 UTF-8 BOM 的 CSV。
这个正则转义工具能解决什么问题
把用户输入、文件名、版本号、金额或文件路径这类字面量直接塞进正则时,其中的 .、+、(、$ 会被引擎当成语法而不是文本。搜索版本号 1.2.3 若写成 /1.2.3/,点号会匹配任意字符,1a2b3、1-2-3 也会一并命中;要找金额 $19.99 却不转义 $,它会被当作行尾锚点,匹配位置整个跑偏。本页把这些字符逐个转义成可安全写进模式的字面量。
要先分清两种输入口径。「模式外」指整段模式的主体,15 个字符都带语法含义,必须加反斜杠;「字符类内」指写在方括号里的那一段,规则完全不同——里面只有 ]、\、^、- 四个需要处理,.、*、(、$ 本来就是字面量,多转只会让模式变长、可读性变差。同一段文本选错口径,要么漏转导致匹配范围被放大,要么多转导致模式难维护。
反转义负责另一条路径:把已转义过的串还原成原始文本,适合核对上一步改了什么,或把别人给的转义结果还原成可读内容。转义再反转义回到原串成立,但拿一段本来就有反斜杠的文本直接反转义,结果会与直觉不同,因为反转义只识别它自己那套「反斜杠加特殊字符」的组合。
语法合法性不在本页职责范围:本页只做字面量转义,不判断括号是否配对、量词是否合法。模式写了却不生效时,应把结果交给正则表达式测试工具逐段验证。
计算原理与变量说明
本页把输入字符分成三组:模式外的 15 个特殊字符、字符类内的 4 个特殊字符、其余一律原样保留的普通字符。分组依据是各字符在正则语法里的角色,而非「看起来像符号就转」。
其一,字符类内部的转义规则与模式外完全不同。字符类 [...] 是一段独立语法,类内只有 ] 必须转(否则会提前闭合字符类)、\ 必须转、^ 仅当出现在首位时才表示取反(要当字面量得写成 \^ 或把它挪出首位)、- 仅在两个字符之间才表示范围(放在首尾就是普通连字符,所以 [a-z]、[-az]、[az-] 三者含义并不一样)。而 .、*、(、$ 在类内已经是字面量,不转才是对的。本页的「字符类内」模式据此只动这四个字符,并自动补上外层方括号。
其二,用 RegExp 构造函数传字符串时反斜杠要写两遍。写成正则字面量是 /a\+b/,而写成 new RegExp("a\\+b") 时必须两个反斜杠。原因是字符串本身会先把 \\ 解析成一个反斜杠,正则引擎随后才收到这一个反斜杠。少写一遍,反斜杠在字符串解析阶段就被吃掉,正则实际收到的是 a+b,加号又变回量词,匹配范围瞬间放大。这是把转义结果复制进代码时最常见的坑:本页按「字面量」口径统一输出,粘进 new RegExp 前需要把每个反斜杠再翻一倍。
其三,斜杠 / 存在两种口径。在正则字面量里 / 是定界符,直接出现会提前结束字面量,所以必须写成 \/;但在 new RegExp("...") 里斜杠没有定界符含义,不转也合法。本页统一按字面量口径转义,好处是输出到哪都安全,代价是复制到构造函数时多一个无害的反斜杠。
其四,本页只做字面量转义,不校验语法。它不会判断 \[ 是否配对、{2,3} 的区间是否合法、命名分组是否重名;这些属于语法层面。转义只保证「这些字符按文本匹配」,不保证「整条模式合法」,也不对模式的行为做任何承诺。
结果里的几个量都按字符计:原串长度按 Unicode 码点逐个计数,中文与 emoji 各算一个;结果长度含新增的反斜杠与外层方括号;「变化字符数」统计输出与输入不同的位置。
完整示例(数值仅作演示)
输入 a+b(c),模式外转义得到 a\+b\(c\):加号与两对括号各加一个反斜杠,共 3 个字符发生变化。切到字符类内,同一输入得到 [a+b(c)]——加号、括号、点在类内都是字面量,一个都不用转,只在外层补上方括号。
输入 price: $19.99 (50% off),模式外转义得到 price: \$19\.99 \(50% off\):$ 转成 \$,两个点号各转成 \.,一对括号转成 \( 与 \),共 5 个字符发生变化;百分号、空格、字母与数字一律不动。
输入 C:\Users\test\file.txt,模式外转义得到 C:\\Users\\test\\file\.txt:两处目录分隔反斜杠各翻倍成 \\,文件名里的点号转成 \.,共 3 个字符发生变化。Windows 路径几乎每一层都带反斜杠,是最容易漏转的一类输入。
把这些结果交给「反转义」,都能回到原始文本。反过来,若对 C:\\Users\\test\file\.txt 再转义一次,反斜杠会被当成普通字符继续翻倍——这也说明先判断当前串处于哪种状态很重要。
正则转义对照表
下表列出模式外需要转义的 15 个字符,第三列是各自加反斜杠后的写法。
| 字符 | 在模式里的含义 | 转义写法 |
|---|---|---|
. | 任意字符(换行除外) | \. |
^ | 行首锚点,或在类内首位表示取反 | \^ |
$ | 行尾锚点 | \$ |
* | 量词:重复 0 次或多次 | \* |
+ | 量词:重复 1 次或多次 | \+ |
? | 量词:出现 0 次或 1 次 | \? |
( | 分组开始 | \( |
) | 分组结束 | \) |
[ | 字符类开始 | \[ |
] | 字符类结束(模式外也建议转) | \] |
{ | 量词开始(如 2,3 次) | \{ |
} | 量词结束 | \} |
| | 或者(分支) | \| |
\ | 转义符自身 | \\ |
/ | JS 正则字面量的定界符 | \/ |
下表是字符类 [...] 内部的差异。它只有 4 个字符需要留意,其余符号在类内已经是字面量。
| 字符 | 类内行为 | 处理方式 |
|---|---|---|
] | 必须转,否则会提前闭合字符类 | \] |
\ | 必须转,否则会吃掉后一个字符 | \\ |
^ | 仅在首位表示取反,其它位置是字面量 | 首位写 \^,其余位置原样 |
- | 仅在两字符之间表示范围,放首尾即字面量 | 中段写 \- |
. | 类内已是字面量,不必转 | 原样 |
* | 类内已是字面量,不必转 | 原样 |
( | 类内已是字面量,不必转 | 原样 |
$ | 类内已是字面量,不必转 | 原样 |
下表是常见易错场景,第四列说明若不转义会怎样。
| 场景 | 原串 | 转义后 | 说明 |
|---|---|---|---|
| 匹配点号版本号 | 1.2.3 | 1\.2\.3 | 不转的话 1a2b3 也会匹配 |
| 匹配美元金额 | $19.99 | \$19\.99 | $ 在行尾是锚点 |
| 匹配 Windows 路径 | C:\Users | C:\\Users | 每层的反斜杠都要转 |
| 匹配括号内容 | (50%) | \(50%\) | 括号是分组 |
| 匹配加号 | C++ | C\+\+ | 加号是量词 |
| 匹配方括号 | [id] | \[id\] | 方括号是字符类 |
| 匹配花括号 | {name} | \{name\} | 花括号是量词 |
| 匹配问号 | what? | what\? | 问号是量词 |
| 匹配星号 | a*b | a\*b | 星号是量词 |
| 匹配竖线 | a|b | a\|b | 竖线表示「或」 |
| 匹配脱字符 | a^b | a\^b | 脱字符是行首锚点 |
| 匹配连字符范围 | a-z | [a\-z] | 类内放中间要转 |
结果边界、舍入与适用说明
- 空输入给出明确错误,不会静默输出空串;输入超过 10 万字符给出提示,建议分段处理。
- 转义与反转义都按字符逐个处理,不做语法校验,也不对不存在的转义序列报错——反转义遇到孤立的反斜杠会原样保留。
- 「变化字符数」只统计输出与输入不同的位置。示例
a+b(c)记 3,price: $19.99 (50% off)记 5。 - 对已经转义过的串再转义,反斜杠会被继续翻倍,得到
\\这样的双反斜杠;需要还原时请切到「反转义」。 - 字符类内反转义若输入没有外层方括号,会按内层文本处理并给出提示,不会强行补括号。
- 结果按 UTF-8 在本地计算,中文与 emoji 按码点计一个字符、不参与转义。
- 本页不生成正则、不发请求、不存历史;转义只是把文本变成字面量,是否匹配由你自己的模式与引擎决定。
常见问题
为什么 /a\+b/ 和 new RegExp("a\\+b") 写法不一样?
字面量 /a\+b/ 里,正则引擎直接看到 \+。而 new RegExp("a\\+b") 的字符串会先把 \\ 解析成一个反斜杠,引擎才收到 \+。若只写一个反斜杠,字符串解析阶段就把它吃掉了,引擎收到的是 a+b,加号又变成量词。
字符类内的转义为什么比模式外少那么多?
因为方括号里的语法环境不同。类内只有 ] 和 \ 永远要转,^ 只在首位、- 只在两字符之间才有特殊含义;.、*、(、$ 进了类内就退化成普通字符。
/ 到底要不要转?
看用法。写在正则字面量 /.../ 里,斜杠是定界符,必须写成 \/;写在 new RegExp("...") 的字符串里,斜杠没有定界符含义,不转也合法。本页统一转,输出到哪都安全。
反转义能百分百还原吗?
对「本页转义过的串」可以还原。但对别的来源,比如本来就含反斜杠的路径,反转义只识别它自己那套转义组合,遇到不符合的序列会原样保留,结果可能与原始文本不同。
输入里有中文或 emoji 会怎样?
原样保留,不参与转义。转义只针对那 15 个(模式外)或 4 个(字符类内)ASCII 特殊字符,中文、emoji、字母数字、空格都不会被改动,长度按 Unicode 码点统计。
转义后就能直接当正则用了吗?
不能直接当「一条完整模式」用。转义只保证这些字符按文本匹配,不保证括号配对、量词区间等语法正确;拼进完整模式后仍建议用测试工具验证一遍。
这个工具免费吗?
免费,无需注册即可使用。
输入的数据安全吗?
安全。计算在当前浏览器本地完成,不会上传输入内容。