正则字符转义

正则里元字符有特殊含义;想匹配这个字符本身,就要在它前面加反斜杠 \ 做转义,让正则引擎不再把它当成特殊符号。

元字符清单(常见):. \ + * ? [ ] ( ) { } | ^ $


逐个例子理解

  1. . 正则含义:任意单个字符(除换行)
    • 想匹配字面量小数点 → 写成 \.
    • 例子:匹配 www.foxdevelop.com
      • 错误:www.foxdevelop.com. 会匹配任意字符,www.foxdevelop@comwww.foxdevelop#com 也能命中
      • 正确:www\.foxdevelop\.com → 只匹配小数点本身
  2. * 正则含义:量词,前面字符出现 0次或多次
    • 想匹配字面量星号\*
  3. \ 反斜杠本身(重点!双层转义坑) 这里很容易混淆:正则字符串本身 + 编程语言字符串两层转义
    • 正则表达式语法层面:匹配字面 \,正则模式写 \\
    • 如果写在代码字符串里(JS、C#、Java等),字符串本身 \ 也要转义,就变成 \\\\

举你原文的例子:

  • 目标:匹配字面文本 \b
    • 正则模式(正则引擎看到的):\\b
    • 如果放在C#普通字符串里:"\\\\b"
    • C# 逐字字符串 @"\\b"

区分两个概念: \b 在正则里 = 单词边界(特殊元序列,不是字符\+b\\b 在正则里 = 字符 \ 后面跟字符 b,也就是字面文本 \b

  • 目标:匹配字面文本 \*
    • 正则模式:\\\*
    • 含义:\\匹配\\*匹配*,合起来匹配 \*

错误写法

\[a-z] 不能写成 [a-z\]

  • [ ] 是字符集元字符。[a-z\] 里最后的 \]\ 放在 ] 前面,在字符组内规则不一样,容易出错;
  • 字符组 [] 内部:大部分元字符失去特殊含义,但是 \^-] 仍然需要留意转义。

总结

正则元字符,加 \ 还原字面; 反斜杠最麻烦,一层正则一层代码; 想匹配小数点,记得写成 .

开发工具

很多语言提供内置函数,自动把字符串里所有正则元字符转义,不用手动一个个加 \

  • C#:Regex.Escape(input)
  • JavaScript:自己封装 escapeRegExp
  • Python:re.escape()

例如 C#:

string raw = "[http://www.foxdevelop.com](http://www.foxdevelop.com)";
string pattern = Regex.Escape(raw); 
// pattern 自动变成 http://www\.foxdevelop\.com
Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注