正则表达式详细总结
正则表达式(Regular Expression,简称 RegEx)是一种强大的工具,用于匹配、查找、替换符合特定规则的字符串。它广泛应用于文本处理、表单验证、数据提取等场景。
一、正则表达式的组成
正则表达式由普通字符和具有特殊含义的元字符(metacharacters)组成。普通字符包括字母、数字和其他未被正则表达式解释的字符。而元字符则用来构建匹配规则。
二、元字符
元字符是正则表达式中具有特殊含义的字符。以下是常见的元字符及其功能:
元字符 | 说明 |
---|---|
. |
匹配除换行符以外的任意单个字符 |
\w |
匹配字母、数字、下划线 |
\s |
匹配空白字符(空格、制表符、换页符等) |
\d |
匹配数字(0-9) |
\b |
匹配单词边界 |
^ |
匹配字符串的开头(在集合内,如 [^a] ,表示“非”) |
$ |
匹配字符串的结尾 |
[] |
匹配方括号内的任意字符,例如 [aeiou] 匹配任意元音字母 |
[^] |
匹配不在括号内的字符,例如 [^aeiou] 匹配非元音字母 |
\ |
转义字符,用于匹配元字符本身(如 \. 匹配字符 . ) |
示例
.
匹配任意字符:a.b
匹配acb
、a1b
等,但不匹配ab
。\d
匹配数字:\d{3}
匹配连续的三个数字,如123
。^
和$
匹配开头和结尾:^abc$
匹配整个字符串是abc
。
三、反义字符
反义字符用于匹配某类字符的非集合内容。
反义字符 | 说明 |
---|---|
\W |
匹配非字母、数字、下划线的字符 |
\S |
匹配非空白字符 |
\D |
匹配非数字字符 |
\B |
匹配非单词边界 |
[^x] |
匹配除了 x 以外的任意字符 |
[^abc] |
匹配除了 a 、b 、c 以外的任意字符 |
示例
\W
匹配非单词字符:如+
、#
等。\S
匹配非空白字符:如a
或1
。
四、限定符
限定符用于指定匹配字符的重复次数。
限定符 | 说明 |
---|---|
* |
匹配前面的字符 0 次或多次 |
+ |
匹配前面的字符 1 次或多次 |
? |
匹配前面的字符 0 次或 1 次 |
{n} |
匹配前面的字符恰好 n 次 |
{n,} |
匹配前面的字符至少 n 次 |
{n,m} |
匹配前面的字符 n 到 m 次 |
示例
a*
匹配 0 或多次 a:可匹配""
、a
、aa
等。\d{3,5}
匹配 3 到 5 位数字:如123
或12345
。
五、懒惰匹配和贪婪匹配
- 贪婪匹配:默认行为,尽可能多地匹配字符。
- 懒惰匹配:通过添加
?
,匹配尽可能少的字符。
贪婪匹配 | 懒惰匹配 |
---|---|
.* |
.*? |
.+ |
.+? |
.? |
?? |
{n,m} |
{n,m}? |
示例
- 贪婪匹配:
a.*b
匹配a123b456b
的整个字符串。 - 懒惰匹配:
a.*?b
匹配a123b
。
六、分组与分枝
1. 分组
分组通过括号 ()
将一部分规则组合为一个整体。
语法 | 说明 |
---|---|
(exp) |
捕获分组,匹配 exp 并捕获到分组 |
(?:exp) |
非捕获分组,匹配 exp 但不捕获 |
(?<name>exp) |
命名捕获分组,匹配 exp 并捕获为 name 的组 |
2. 分枝
分枝通过 |
表示“或”关系。
示例
- 捕获分组:
(ab)+
匹配abab
,捕获ab
。 - 分枝:
a|b
匹配a
或b
,例如cat|dog
匹配cat
或dog
。
七、零宽断言
零宽断言用于匹配满足某些条件的位置,而不消费字符。
语法 | 说明 |
---|---|
(?=exp) |
正向预测断言,匹配后面是 exp 的位置 |
(?!exp) |
负向预测断言,匹配后面不是 exp 的位置 |
(?<=exp) |
正向回顾断言,匹配前面是 exp 的位置 |
(?<!exp) |
负向回顾断言,匹配前面不是 exp 的位置 |
示例
- 正向预测:
\w+(?=ing)
匹配sing
中的sing
。 - 负向回顾:
(?<!not )good
匹配good
,但不匹配not good
。
八、后向引用
后向引用可以重复匹配捕获分组内的内容。
语法 | 说明 |
---|---|
\1 |
引用第一个捕获分组的内容 |
\k<name> |
引用命名捕获分组 name 的内容 |
示例
- **
\1
**:\b(\w+)\b\s+\1
匹配重复单词(如go go
)。 - **
\k<name>
**:(?<word>\w+)\s+\k<word>
匹配命名分组的重复。
九、转义字符
转义字符用于匹配元字符本身。
转义字符 | 说明 |
---|---|
\. |
匹配字符 . |
\* |
匹配字符 * |
\? |
匹配字符 ? |
\\ |
匹配字符 \ |
十、常用正则表达式
功能 | 表达式 |
---|---|
匹配数字 | ^\d+$ |
匹配邮箱 | ^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$ |
匹配 IP 地址 | `^((25[0-5] |
匹配日期(yyyy-mm-dd) | `^(19 |
匹配中文 | ^[\u4e00-\u9fa5]+$ |
匹配 URL | ^https?:\/\/[\w\-]+(\.[\w\-]+)+[\w\-\.,@?^=%&:/~+#]*$ |
十一、正则表达式的模式修饰符
修饰符 | 说明 |
---|---|
i |
忽略大小写 |
m |
多行模式,^ 和 $ 匹配每行的开头和结尾 |
s |
单行模式,使 . 匹配包括换行符在内的所有字符 |
x |
忽略空白符并启用注释 |