正则表达式(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:匹配单词边界。
• ^: 匹配字符串开头。
• $: 匹配字符串结尾。
正则表达式是一种非常强大的工具,可以用于复杂的字符串匹配和处理。掌握基本的元字符和规则后,可以通过组合这些规则来实现各种复杂的匹配需求。