正则表达式中需转义的元字符包括 .、*、+、?、^、$、( )、[ ]、{ }、|、 及分隔符(如 /、#),否则会被当作语法结构处理;转义方式为前置反斜杠,且需考虑语言的双重解析(如 python 用 r""、js 构造函数需双反斜杠);推荐使用 re.escape 等内置函数自动转义,或用字符组 [.] 等简化单字符转义。
正则表达式里那些带功能的符号(比如 .、*、+、?、^、$、( )、[ ]、{ }、|、、/)一旦出现在待匹配文本中,就必须转义,否则会被正则引擎当作语法结构处理——比如 a.b 匹配的是 “a + 任意字符 + b”,而不是字面的 “a.b” 这个字符串。
哪些字符必须转义才能匹配字面值
以下元字符在正则中具有预定义含义,想让它们代表自己本身,就得加反斜杠:
-
.→ 写成.(否则匹配任意非换行字符) -
*、+、?→ 分别写成*、+、?(否则表示重复或可选) -
^和$→ 写成^、$(否则锚定行首/行尾) -
( )、[ ]、{ }、|→ 全部前置,如(、[、{、| -
自身 → 必须写成\(因为字符串和正则各吃一层) -
/(JavaScript 字面量中)、#(PHP 分隔符)等分隔符 → 若出现在模式中,也需转义,否则提前截断
不同语言里的双重解析问题
反斜杠要写几层,取决于语言对字符串和正则的两级解析:
-
Python:推荐用原始字符串
r""。匹配price: $12.5,写r'price: $d+.d+';不用r就得写'price: \$\d+\.\d+' -
JavaScript:字面量如
/a.b/;用RegExp构造函数时,字符串参数需双写反斜杠:new RegExp('a\.b') -
PHP:单引号字符串干扰少,
'/a.b/';若用双引号,"/a.b/";更稳妥用preg_quote('a.b', '/') -
C#:普通字符串写
"a\.b";逐字字符串@"/a.b/"可省一层
用现成函数自动转义最可靠
手动加反斜杠容易漏、易多、难维护,尤其面对用户输入或动态内容:
-
Python:直接用
re.escape("a.b*c?")→'a\.b\*c\?',它会把所有非字母数字字符全转义 -
JavaScript:自定义或复用标准
escapeRegExp函数:string.replace(/[.*+?^${}()|[]\]/g, '\$&') -
PHP:必须传分隔符,
preg_quote('https://site.com', '/')→https://site.com
字符组 [ ] 是轻量替代方案
对单个元字符,放进方括号里也能取消特殊性,写法更简洁:
-
[.]等价于.,匹配一个点 -
[*]等价于*,匹配一个星号 -
[]]匹配字面的](]放在字符组开头或紧跟[后) -
[]匹配一个反斜杠(字符组内反斜杠不自动转义,只需一个)
注意:字符组不能用于 d、s 这类预定义类,只适用于元字符字面匹配。











