正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于匹配字符串中字符组合的模式。它是一种强大的文本处理工具,可以用来执行复杂的字符串搜索、替换、验证等操作。
1.组成
正则表达式由普通字符(如字母、数字)和特殊字符(称为元字符)组成。元字符用于定义匹配规则,例如匹配任意字符、重复次数等。
2.常用元字符及语法
元字符:
元字符 | 含义 |
---|---|
. | 匹配任意单个字符(除换行符 \n 外) |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
\d | 匹配任意数字(0-9) |
\w | 匹配任意字母或数字(等价于 [a-zA-Z0-9_] ) |
\s | 匹配任意空白字符(空格、制表符、换行符等) |
\D | 匹配任意非数字字符 |
\W | 匹配任意非字母数字字符 |
\S | 匹配任意非空白字符 |
[abc] | 匹配字符集中的任意一个字符(例如 a 、b 或 c ) |
[a-z] | 匹配任意一个小写字母(范围匹配) |
[A-Z] | 匹配任意一个大写字母 |
[0-9] | 匹配任意一个数字 |
[^abc] | 匹配不在字符集中的任意一个字符 |
* | 匹配前面的字符 零次或多次 |
+ | 匹配前面的字符 一次或多次 |
? | 匹配前面的字符 零次或一次 |
{n} | 匹配前面的字符 恰好 n 次 |
{n,} | 匹配前面的字符 至少 n 次 |
{n,m} | 匹配前面的字符 至少 n 次,但不超过 m 次 |
() | 分组(用于捕获匹配的子串) |
| | 匹配多个选项中的任意一个 |
\ | 转义字符(用于匹配元字符本身) |
语法:
1.捕获组与非捕获组
• ()
捕获组 :捕获匹配的子字符串,可以通过 $1
、 $2
等在替换中引用。
• (?: )
非捕获组 :在分组中加上 ?:
,表示不捕获子字符串。
2.断言(Assertions)
断言用于指定匹配的条件,但不消耗字符(即不移动匹配的"游标")。
• (?= )
零宽正向肯定断言 :匹配某个位置的后面是否符合某个模式。
• 示例:abc(?=def) 匹配 abc,但仅当其后面是 def 时。
• 示例:\d+(?=元) 匹配数字,但仅当其后面是"元"时。
• (?! )
零宽正向否定断言 :匹配某个位置的后面是否不符合某个模式。
• 示例:abc(?!def) 匹配 abc,但仅当其后面不是 def 时。
• 示例:\d+(?!元) 匹配数字,但仅当其后面不是"元"时。
• (?<= )
零宽负向肯定断言 :匹配某个位置的前面是否符合某个模式。
• 示例:(?<=abc)def 匹配 def,但仅当其前面是 abc 时。
• 示例:(?<=\d+)元 匹配"元",但仅当其前面是数字时。
• (?<! )
零宽负向否定断言 :匹配某个位置的前面是否不符合某个模式。
• 示例:(?<!abc)def 匹配 def,但仅当其前面不是 abc 时。
• 示例:(?<!\d+)元 匹配"元",但仅当其前面不是数字时。
3.修饰符(Modifiers)
修饰符用于改变正则表达式的匹配行为。
• i
:不区分大小写
• 示例:/abc/i
匹配 abc、Abc、ABC 等。
• g
: 全局匹配 ,匹配所有符合条件的子字符串。
• 示例:/abc/g
匹配字符串中所有 abc。
• m
: 多行模式 ,在多行字符串中,匹配每一行的开头和结尾
• 示例:/hello$/m
在多行字符串中,匹配每一行以 hello 结尾的行。
• s
:".
"匹配所有字符 ,包括换行符。
• 示例:/hello.world/s 匹配跨行的
hello
world。
3.常见用法
以下是一些常见的正则表达式用法示例:
1.匹配电子邮件地址
电子邮件地址通常包含用户名、@ 符号和域名。正则表达式可以用来匹配这种格式:
py
\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b
2.匹配电话号码
电话号码的格式可能因国家而异,但常见的格式是:
py
\+?\d{1,3}[-.\s]?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
这个正则表达式可以匹配国际电话号码(带或不带 + 号)、带括号的区号等。
3.匹配日期
日期格式可以是 YYYY-MM-DD
或 DD/MM/YYYY
等:
#匹配 YYYY-MM-DD
格式
py
\b\d{4}-\d{2}-\d{2}\b
#匹配 DD/MM/YYYY
格式
py
\b\d{2}/\d{2}/\d{4}\b
4. 匹配网址
网址通常以 http://
或 https://
开头,后面跟着域名和路径:
py
\bhttps?://[^\s]+
5. 匹配 IP 地址
IPv4 地址由四组数字组成,每组数字范围是 0-255:
py
\b(?:\d{1,3}\.){3}\d{1,3}\b
6. 匹配纯数字
匹配任意长度的数字:
py
\b\d+\b
7. 匹配单词
匹配任意单词(字母组成):
py
\b\w+\b
8. 匹配特定格式的字符串
例如,匹配以 abc
开头,以 xyz
结尾的字符串:
py
^abc.*xyz$
4.注意事项
1. 转义字符: 如果需要匹配元字符本身(如 .
、*
、?
等),需要用反斜杠杠\
进行转义。例如,要匹配一个点号 .
,应写为\.
。而在方括号 []
内,只有 ^
(在开头时)、-
(在中间时)和 \
需要特别注意转义。其他字符通常不需要转义。
2. 贪婪模式与非贪婪模式: 默认情况下,正则表达式是贪婪的,会尽可能多地匹配字符。这可能会受到ReDoS攻击。如果需要非贪婪匹配(尽可能少地匹配字符),可以在量词后面加上 ?
。例如:
• 贪婪模式: .\*
(匹配尽可能多的字符)
• 非贪婪模式: .\*?
(匹配尽可能少的字符)
3. 边界匹配:
• \b
:匹配单词边界。
• ^
: 匹配字符串开头。
• $
: 匹配字符串结尾。
正则表达式是一种非常强大的工具,可以用于复杂的字符串匹配和处理。掌握基本的元字符和规则后,可以通过组合这些规则来实现各种复杂的匹配需求。