正则转义要转哪些字符?14 个特殊字符清单
用户搜「1.5」时,如果直接把 1.5 拼进正则,点号会匹配任意字符,结果里混进 1X5、1a5。转义就是给这些有特殊含义的字符加上反斜杠,让它们只代表自己。
什么时候必须转义
搜索框、日志过滤、批量重命名都涉及同一件事:把用户输入当作普通文字来匹配。输入里只要出现点号、星号、括号、方括号,不转义就会改变匹配含义,轻则多匹配一堆无关内容,重则正则语法错误直接抛异常。
另一种场景是把文件名、网址、版本号当作模式。1.2.3 里的点号、a+b 里的加号、[草稿] 里的方括号,都需要转义后才能按字面量匹配,否则 1.2.3 会连 1x2y3 一起匹配上。
- 把搜索框里的用户输入拼进正则
- 按文件名或版本号做字面量匹配
- 在日志里查找含特殊符号的字符串
- 生成可读的匹配规则并写进配置文件
具体是哪 14 个字符
清单是:点号、星号、加号、问号、脱字符、美元符、左花括号、右花括号、左圆括号、右圆括号、竖线、左方括号、右方括号、反斜杠,一共 14 个。它们在正则里有特殊含义,前面加一个反斜杠之后就按字面量处理。
不在清单里的字符保持原样:连字符、斜杠、空格、字母和数字都不会被加上反斜杠。所以结果比「每个字符都转义」短,也更好读。但如果这段文字要放进方括号构成的字符类里,连字符在中间仍然有特殊含义,需要自己处理。
- 转义 14 个字符:. * + ? ^ $ { } ( ) | [ ] \
- 连字符与斜杠不转义
- 空格、字母、数字保持原样
- 字符类里的连字符需另行处理
拼进正则时的两个坑
第一,不要对已经转义过的文本再转一次。反斜杠本身也在清单里,再转一次会变成两个反斜杠,匹配目标就从「点号」变成「反斜杠加点号」,结果一个都匹配不上。这种错误在排查时很难一眼看出,建议拼好后先用一条样例验证。
第二,很多语言还有一层字符串转义。Java 里要写两个反斜杠才等于正则里的一个,Python 普通字符串同理,用原始字符串可以省掉这一层。工具只处理正则这一层,语言字符串那一层需要你自己补。
- 不要重复转义,反斜杠会翻倍
- Java、Python 的字符串层还要再加一层
- Python 可用原始字符串避免二次转义
- 拼好后先用一条测试字符串验证
常见问题
哪些字符需要转义?
点号、星号、加号、问号、脱字符、美元符、花括号、圆括号、竖线和方括号,再加上反斜杠本身,共 14 个。连字符和斜杠不在其中,工具不会给它们加反斜杠。
转义后为什么还留着反斜杠?
反斜杠就是转义标记,它告诉正则引擎后面的字符按字面量处理,所以必须保留。把结果写进代码时,如果语言本身也解析反斜杠,还需要再加一层,例如 Java 字符串里要写成两个反斜杠。
能直接用 re.escape 或 RegExp.escape 吗?
可以,目的一致,都是把特殊字符转成字面量。不同实现的转义集合略有差别,有的会把空格或连字符也转义,跨语言对照时以实际输出为准,不要假设两边完全一样。
相关工具:正则转义