正则里元字符有特殊含义;想匹配这个字符本身,就要在它前面加反斜杠 \ 做转义,让正则引擎不再把它当成特殊符号。
元字符清单(常见):
. \ + * ? [ ] ( ) { } | ^ $
逐个例子理解
.正则含义:任意单个字符(除换行)- 想匹配字面量小数点 → 写成
\. - 例子:匹配
www.foxdevelop.com- 错误:
www.→foxdevelop.com.会匹配任意字符,www.foxdevelop@com、www.foxdevelop#com也能命中 - 正确:
www\.foxdevelop\.com → 只匹配小数点本身
- 错误:
- 想匹配字面量小数点 → 写成
*正则含义:量词,前面字符出现 0次或多次- 想匹配字面量星号 →
\*
- 想匹配字面量星号 →
\反斜杠本身(重点!双层转义坑) 这里很容易混淆:正则字符串本身 + 编程语言字符串两层转义- 在正则表达式语法层面:匹配字面
\,正则模式写\\ - 如果写在代码字符串里(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)
。