Regular Expression Rules Detailed Explanation
正则表达式 (Regular Expression,简称 regex) 是一种用于匹配和操作文本的强大工具。它通过定义特定的模式来查找、验证或替换字符串。本文档详细介绍正则表达式的规则,包括基本语法、常用元字符、量词、捕获组等,并提供示例。
1. Regular Expression Basics
正则表达式由普通字符和元字符组成:
- 普通字符:如字母、数字、符号 (如
a、1、@),直接匹配自身。 - 元字符:具有特殊意义的字符,如
.、^、*等,用于定义匹配规则。
正则表达式通常用斜杠 / 包裹 (如 /abc/),但在不同语言中可能有所不同 (例如 Python 用字符串表示,JavaScript 用 /.../) 。
2. Common Metacharacters
以下是正则表达式中常用的元字符及其含义:
| 元字符 | 描述 | 示例 | 匹配结果 |
|---|---|---|---|
. | 匹配除换行符 (\n) 外的任意单个字符 | a.c | abc, a1c, a@c |
^ | 匹配字符串的开头 | ^abc | abc (仅在字符串开头) |
$ | 匹配字符串的结尾 | abc$ | abc (仅在字符串结尾) |
* | 匹配前面的字符或子表达式 0 次或多次 | ab*c | ac, abc, abbc |
+ | 匹配前面的字符或子表达式 1 次或多次 | ab+c | abc, abbc (不匹配 ac) |
? | 匹配前面的字符或子表达式 0 次或 1 次 | ab?c | ac, abc |
| ` | ` | 或运算,匹配左侧或右侧的模式 | `a |
[] | 匹配方括号内的任意一个字符 | [abc] | a, b, 或 c |
[^] | 匹配不在方括号内的任意字符 | [^abc] | 非 a、b、c 的字符 |
() | 定义子表达式或捕获组 | (abc) | 匹配 abc 作为一个整体 |
{n} | 精确匹配前面的字符或子表达式 n 次 | a{3} | aaa |
{n,} | 匹配前面的字符或子表达式至少 n 次 | a{2,} | aa, aaa, aaaa |
{n,m} | 匹配前面的字符或子表达式 n 到 m 次 | a{2,3} | aa, aaa |
3. Character Classes
字符类用于匹配特定范围或类型的字符:
- 预定义字符类:
\d:匹配任意数字,等价于[0-9].\D:匹配非数字,等价于[^0-9].\w:匹配任意字母、数字或下划线,等价于[a-zA-Z0-9_]dissuades\W:匹配非字母、数字或下划线,等价于[^a-zA-Z0-9_].\s:匹配任意空白字符 (如空格、制表符、换行符) 。\S:匹配非空白字符。
- 自定义字符类:
[a-z]:匹配小写字母a到z.[A-Z]:匹配大写字母A到Z.[0-9]:匹配数字0到9.[a-zA-Z]:匹配任意字母。[a-dm-p]:匹配a到d或m到p的字符。
示例:
\d{3}:匹配三个数字,如123.[a-zA-Z]+:匹配一个或多个字母,如hello.
4. Quantifiers
量词控制前面的字符或子表达式的重复次数:
*:0 次或多次。+:1 次或多次。?:0 次或 1 次。{n}:精确 n 次。{n,}:至少 n 次。{n,m}:n 到 m 次。
贪婪模式与非贪婪模式:
- 默认情况下,量词是贪婪模式,匹配尽可能多的字符。例如,
a.*b匹配a123b456b中的a123b456b. - 添加
?后变为非贪婪模式,匹配尽可能少的字符。例如,a.*?b匹配a123b456b中的a123b.
5. Capture Groups and Non-Capture Groups
- 捕获组:用
()包裹的子表达式,可以提取匹配的内容或进行反向引用。- 示例:
(\d{2})-(\d{2})匹配12-34,捕获组 1 为12,捕获组 2 为34. - 反向引用:使用
\n(n 为组编号) 引用捕获组。例如,(a)\1匹配aa(两个相同的a) 。
- 示例:
- 非捕获组:用
(?:...)定义,不保存匹配内容,仅用于分组。- 示例:
(?:abc)匹配abc,但不捕获。
- 示例:
6. Boundaries and Assertions
- 单词边界:
\b:匹配单词边界。例如,\bcat\b匹配cat,但不匹配category中的cat.\B:匹配非单词边界。
- 前瞻与后顾断言:
(?=...):正向前瞻,匹配后面跟着某模式的情况。例如,a(?=b)匹配ab中的a.(?!...):负向前瞻,匹配后面不跟某模式的情况。例如,a(?!b)匹配ac中的a.(?<=...):正向后顾,匹配前面是某模式的情况。例如,(?<=b)a匹配ba中的a.(?<!...):负向后顾,匹配前面不是某模式的情况。例如,(?<!b)a匹配ca中的a.
7. Modifiers (Flags)
修饰符控制正则表达式的行为,常见修饰符包括:
i:忽略大小写。例如,/abc/i匹配ABC.g:全局匹配,查找所有匹配项。m:多行模式,^和$匹配每行的开头和结尾。- 注意:
- 修饰符的写法因语言而异。例如,在 JavaScript 中,修饰符写在正则表达式后 (如
/abc/gi) ,而在 Python 中通过re.compile(pattern, re.IGNORECASE)指定。
- 修饰符的写法因语言而异。例如,在 JavaScript 中,修饰符写在正则表达式后 (如
8. Common Application Examples
以下是一些常见的正则表达式应用场景及其示例:
- 验证邮箱格式:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ - 提取 URL:
https?://[^\s]+ - 验证密码 (至少 8 位,包含字母、数字、特殊字符):
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$ - 匹配日期格式 (YYYY-MM-DD):
\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])