正则表达式速查表
正则表达式(Regex)语法速查:元字符、字符类、锚点、量词、分组与前后行断言,附中文说明,调试正则时快速查阅。
| 符号 | 含义 |
|---|---|
| . | 任意单个字符(默认不含换行) |
| \d | 数字 [0-9] |
| \D | 非数字 |
| \w | 单词字符 [A-Za-z0-9_] |
| \W | 非单词字符 |
| \s | 空白字符(空格/制表/换行) |
| \S | 非空白字符 |
| ^ | 字符串或行开头 |
| $ | 字符串或行结尾 |
| \b | 单词边界 |
| \B | 非单词边界 |
| * | 前一项 0 次或多次(贪婪) |
| + | 前一项 1 次或多次(贪婪) |
| ? | 前一项 0 或 1 次 |
| {n} | 恰好 n 次 |
| {n,} | 至少 n 次 |
| {n,m} | n 到 m 次 |
| (...) | 捕获组 |
| (?:...) | 非捕获组 |
| [...] | 字符类(匹配其中任一) |
| [^...] | 取反字符类 |
| | | 或(分支) |
| \1 | 反向引用第 1 个捕获组 |
| (?=...) | 正向先行断言 |
| (?!...) | 负向先行断言 |
| (?<=...) | 正向后行断言 |
| (?<!...) | 负向后行断言 |
常见问题
贪婪量词与非贪婪量词有什么区别?
贪婪(*、+)会尽可能多匹配;在其后加 ?(*?、+?)变为惰性,尽可能少匹配。例如对 "<a>1</a><a>2</a>",<.*> 会贪心匹配到最后一个 </a>,而 <.*?> 只匹配到第一个。
如何让 . 也能匹配换行符?
默认 . 不匹配换行。可启用 dotall 模式(JS 用 s 标志 /[sS]/,或 PHP/Python 的 DOTALL),或用 [sS] 这类写法兼容所有引擎。
字符类和分组有什么不同?
[abc] 只匹配单个字符(a、b 或 c);(abc) 是一个整体序列,匹配字面子串 "abc",并可作为捕获组整体量化(如 (abc)+)。
写正则要注意什么性能问题?
警惕灾难性回溯:避免嵌套量词如 (a+)+ 匹配失败时会指数级回溯。尽量用明确字符类、锚点 ^ $ 缩小范围,必要时用占有量词或原子组。