正则转义工具

粘贴一段普通文本,按「模式外」或「字符类内」两种口径逐个转义其中的正则特殊字符,给出可安全放进模式里的字面量;也支持反转义还原、逐字符明细、TSV 复制与 CSV 导出,全部在本地浏览器完成。

—

默认示例 price: $19.99 (50% off) 在「模式外 · 转义」下应得到 price: \$19\.99 \(50% off\):只动 $ 与两个点号、一对括号,其余原样保留。

使用方法

  1. 文本框已服务端直出一段示例 price: $19.99 (50% off),打开页面即可看到转义结果,不必先输入;脚本只在该框为空时回填示例。
  2. 「模式」决定转义口径:模式外按 15 个特殊字符逐个加反斜杠;字符类内只处理 ]、\、^、- 四个,其余字符原样保留,并自动补上外层方括号。
  3. 「方向」选择转义或反转义。反转义按相反规则去掉转义反斜杠,用于把已经处理过的串还原成原始字面量。
  4. 按 Ctrl(Mac 上是 Command)+ Enter 触发;文本框里的 Enter 留给换行,不会误触发。
  5. 结果区给出转义后的字符串、原串长度、结果长度与本次发生变化的字符数。
  6. 下方「逐字符明细」列出每个输入字符与它在当前模式下的输出形态;行数多时可点「加载更多」,也可用 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.31\.2\.3不转的话 1a2b3 也会匹配
匹配美元金额$19.99\$19\.99$ 在行尾是锚点
匹配 Windows 路径C:\UsersC:\\Users每层的反斜杠都要转
匹配括号内容(50%)\(50%\)括号是分组
匹配加号C++C\+\+加号是量词
匹配方括号[id]\[id\]方括号是字符类
匹配花括号{name}\{name\}花括号是量词
匹配问号what?what\?问号是量词
匹配星号a*ba\*b星号是量词
匹配竖线a|ba\|b竖线表示「或」
匹配脱字符a^ba\^b脱字符是行首锚点
匹配连字符范围a-z[a\-z]类内放中间要转

结果边界、舍入与适用说明

常见问题

为什么 /a\+b/ 和 new RegExp("a\\+b") 写法不一样?

字面量 /a\+b/ 里,正则引擎直接看到 \+。而 new RegExp("a\\+b") 的字符串会先把 \\ 解析成一个反斜杠,引擎才收到 \+。若只写一个反斜杠,字符串解析阶段就把它吃掉了,引擎收到的是 a+b,加号又变成量词。

字符类内的转义为什么比模式外少那么多?

因为方括号里的语法环境不同。类内只有 ] 和 \ 永远要转,^ 只在首位、- 只在两字符之间才有特殊含义;.、*、(、$ 进了类内就退化成普通字符。

/ 到底要不要转?

看用法。写在正则字面量 /.../ 里,斜杠是定界符,必须写成 \/;写在 new RegExp("...") 的字符串里,斜杠没有定界符含义,不转也合法。本页统一转,输出到哪都安全。

反转义能百分百还原吗?

对「本页转义过的串」可以还原。但对别的来源,比如本来就含反斜杠的路径,反转义只识别它自己那套转义组合,遇到不符合的序列会原样保留,结果可能与原始文本不同。

输入里有中文或 emoji 会怎样?

原样保留,不参与转义。转义只针对那 15 个(模式外)或 4 个(字符类内)ASCII 特殊字符,中文、emoji、字母数字、空格都不会被改动,长度按 Unicode 码点统计。

转义后就能直接当正则用了吗?

不能直接当「一条完整模式」用。转义只保证这些字符按文本匹配,不保证括号配对、量词区间等语法正确;拼进完整模式后仍建议用测试工具验证一遍。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。计算在当前浏览器本地完成,不会上传输入内容。

相关工具