悦省yueser.com

← 全部指南

正则转义要转哪些字符?14 个特殊字符清单

用户搜「1.5」时,如果直接把 1.5 拼进正则,点号会匹配任意字符,结果里混进 1X5、1a5。转义就是给这些有特殊含义的字符加上反斜杠,让它们只代表自己。

打开工具:正则转义

什么时候必须转义

搜索框、日志过滤、批量重命名都涉及同一件事:把用户输入当作普通文字来匹配。输入里只要出现点号、星号、括号、方括号,不转义就会改变匹配含义,轻则多匹配一堆无关内容,重则正则语法错误直接抛异常。

另一种场景是把文件名、网址、版本号当作模式。1.2.3 里的点号、a+b 里的加号、[草稿] 里的方括号,都需要转义后才能按字面量匹配,否则 1.2.3 会连 1x2y3 一起匹配上。

具体是哪 14 个字符

清单是:点号、星号、加号、问号、脱字符、美元符、左花括号、右花括号、左圆括号、右圆括号、竖线、左方括号、右方括号、反斜杠,一共 14 个。它们在正则里有特殊含义,前面加一个反斜杠之后就按字面量处理。

不在清单里的字符保持原样:连字符、斜杠、空格、字母和数字都不会被加上反斜杠。所以结果比「每个字符都转义」短,也更好读。但如果这段文字要放进方括号构成的字符类里,连字符在中间仍然有特殊含义,需要自己处理。

拼进正则时的两个坑

第一,不要对已经转义过的文本再转一次。反斜杠本身也在清单里,再转一次会变成两个反斜杠,匹配目标就从「点号」变成「反斜杠加点号」,结果一个都匹配不上。这种错误在排查时很难一眼看出,建议拼好后先用一条样例验证。

第二,很多语言还有一层字符串转义。Java 里要写两个反斜杠才等于正则里的一个,Python 普通字符串同理,用原始字符串可以省掉这一层。工具只处理正则这一层,语言字符串那一层需要你自己补。

常见问题

哪些字符需要转义?

点号、星号、加号、问号、脱字符、美元符、花括号、圆括号、竖线和方括号,再加上反斜杠本身,共 14 个。连字符和斜杠不在其中,工具不会给它们加反斜杠。

转义后为什么还留着反斜杠?

反斜杠就是转义标记,它告诉正则引擎后面的字符按字面量处理,所以必须保留。把结果写进代码时,如果语言本身也解析反斜杠,还需要再加一层,例如 Java 字符串里要写成两个反斜杠。

能直接用 re.escape 或 RegExp.escape 吗?

可以,目的一致,都是把特殊字符转成字面量。不同实现的转义集合略有差别,有的会把空格或连字符也转义,跨语言对照时以实际输出为准,不要假设两边完全一样。

相关工具:正则转义