正则表达式语法详解
正则表达式的语法主要由普通字符和元字符组成。元字符是具有特殊含义的符号,用于描述复杂的匹配规则。下面系统地介绍最常用、最核心的语法元素(以常见引擎如 JavaScript、Python、PCRE 为准,大多数语言一致)。
1. 基本匹配
- 普通字符:直接匹配自身。
示例:abc匹配 “abc”。 .(点号):匹配任意单个字符(除了换行符\n,某些引擎在特定模式下可包括)。
示例:a.c匹配 “abc”、”a1c”、”a#c” 等。
2. 位置锚定
| 元字符 | 含义 | 示例 | 匹配示例 |
|---|---|---|---|
^ | 匹配字符串或行的开头 | ^abc | “abcde” 中的 “abc” |
$ | 匹配字符串或行的结尾 | abc$ | “xyzabc” 中的 “abc” |
\b | 匹配单词边界 | \bcat\b | “cat”(不匹配 “concat” 中的 cat) |
\B | 匹配非单词边界 | \Bcat\B | “concat” 中的 “cat” |
3. 量词(重复次数)
量词作用于前面的单个字符、字符集或分组。
| 量词 | 含义 | 示例 | 匹配示例 |
|---|---|---|---|
* | 0 次或多次(贪婪) | ab* | “a”、”ab”、”abbb” |
+ | 1 次或多次(贪婪) | ab+ | “ab”、”abb”(不匹配 “a”) |
? | 0 次或 1 次(贪婪) | ab? | “a”、”ab” |
{n} | 正好 n 次 | a{3} | “aaa” |
{n,} | 至少 n 次 | a{2,} | “aa”、”aaa” 等 |
{n,m} | n 到 m 次(含 n 和 m) | a{2,4} | “aa”、”aaa”、”aaaa” |
- 贪婪 vs 懒惰(非贪婪):默认量词是贪婪的(匹配尽可能多),在量词后加
?变为懒惰(匹配尽可能少)。
示例: - 贪婪:
<.*>匹配 “hello” 中的整个 “hello” - 懒惰:
<.*?>匹配 “” 和 “” 分别
4. 字符集合
| 语法 | 含义 | 示例 | 匹配示例 |
|---|---|---|---|
[abc] | 匹配括号内任意一个字符 | [aeiou] | 所有元音字母 |
[^abc] | 否定:匹配不在括号内的任意字符 | [^0-9] | 非数字 |
[a-z] | 范围:a 到 z 的任意字符 | [A-Za-z0-9] | 字母和数字 |
[a-zA-Z] | 多个范围可组合 |
常用简写(等价于字符集合):
| 简写 | 等价于 | 含义 |
|---|---|---|
\d | [0-9] | 数字 |
\D | [^0-9] | 非数字 |
\w | [A-Za-z0-9_] | 单词字符(字母、数字、下划线) |
\W | [^A-Za-z0-9_] | 非单词字符 |
\s | [ \t\r\n\f] | 空白字符(空格、Tab、换行等) |
\S | 非空白字符 |
5. 分组与选择
| 语法 | 含义 | 示例 | 说明 |
|---|---|---|---|
(pattern) | 捕获分组:匹配并记住内容,可后续引用 | (ab)+ | 匹配 “ab”、”abab” 等 |
(?:pattern) | 非捕获分组:只分组,不记住 | (?:ab)+ | 同上,但不创建捕获组 |
| | 或(选择) | cat|dog | 匹配 “cat” 或 “dog” |
a(?=b) | 正向前瞻:a 后面必须紧跟 b(不消耗) | Windows(?=10) | 匹配 “Windows10” 中的 “Windows” |
a(?!b) | 负向前瞻:a 后面不能紧跟 b | \d+(?!px) | 匹配不以 px 结尾的数字 |
(?<=b)a | 正向后瞻:a 前面必须紧跟 b | ||
(?<!b)a | 负向后瞻:a 前面不能紧跟 b |
6. 转义
- 需要匹配元字符本身时,用反斜杠
\转义。
示例: \.匹配点号 “.”\*匹配星号 “*”\\匹配单个反斜杠 “\”
7. 修饰符(Flags)
常见修饰符(放在正则表达式外部,视语言而定):
i:忽略大小写(case-insensitive)g:全局匹配(global)m:多行模式(^ 和 $ 匹配每行开头/结尾)s:点号通配模式(. 也可匹配换行符,称为 dotall)u:Unicode 支持(JS 中)
小结:常用组合示例
| 需求 | 正则表达式示例 | 说明 |
|---|---|---|
| 匹配任意长度数字 | ^\d+$ | 只含数字的整行 |
| 匹配邮箱(简版) | ^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$ | |
| 匹配 HTML 标签 | <[^>]+> | 贪婪匹配一个标签 |
| 匹配非空空白行 | ^\s+$ | 只包含空白字符的行 |
掌握这些语法后,你就能构建绝大多数实际场景所需的正则表达式了。建议多在 regex101.com 上调试练习。
如果你想看某个具体语法的深入示例或练习题,告诉我!