正则表达式
正则表达式(Regular Expression)是一种强大的 文本匹配与处理工具,广泛用于字符串搜索、替换、验证等场景。以下是核心符号及其用法:
1. 基本匹配符号
符号 | 说明 | 示例 |
---|---|---|
. | 匹配 任意单个字符(除换行符 \n ) | "a.c" → "abc" , "a1c" |
\ | 转义特殊字符(如 \. 匹配 . ) | "a\.c" → "a.c" (不匹配 "abc" ) |
[...] | 匹配 括号内任意一个字符 | "[aeiou]" → "a" 、"e" |
[^...] | 匹配 不在括号内的字符 | "[^0-9]" → 匹配非数字字符 |
**` | `** | 或 逻辑(匹配左边或右边) |
2. 预定义字符类
符号 | 说明 | 等价写法 |
---|---|---|
\d | 匹配 数字(0-9) | [0-9] |
\D | 匹配 非数字 | [^0-9] |
\w | 匹配 单词字符(字母、数字、下划线) | [a-zA-Z0-9_] |
\W | 匹配 非单词字符 | [^a-zA-Z0-9_] |
\s | 匹配 空白符(空格、制表符 \t 、换行 \n 等) | [ \t\n\r\f] |
\S | 匹配 非空白符 | [^ \t\n\r\f] |
3. 量词(控制重复次数)
符号 | 说明 | 示例 |
---|---|---|
* | 匹配 0 次或多次 | "a*" → "" 、"a" 、"aaa" |
+ | 匹配 1 次或多次 | "a+" → "a" 、"aaa" (不匹配 "" ) |
? | 匹配 0 次或 1 次 | "a?" → "" 、"a" |
{n} | 匹配 恰好 n 次 | "a{3}" → "aaa" |
{n,} | 匹配 至少 n 次 | "a{2,}" → "aa" 、"aaa" |
{n,m} | 匹配 n 到 m 次 | "a{2,4}" → "aa" 、"aaa" 、"aaaa" |
4. 锚点(位置匹配)
符号 | 说明 | 示例 |
---|---|---|
^ | 匹配 字符串开头 | "^abc" → "abc" (必须在开头) |
$ | 匹配 字符串结尾 | "xyz$" → "xyz" (必须在结尾) |
\b | 匹配 单词边界 | "\bcat\b" → "cat" (不匹配 "category" ) |
\B | 匹配 非单词边界 | "\Bcat\B" → "scatter" 中的 "cat" |
5. 分组与捕获
符号 | 说明 | 示例 |
---|---|---|
(...) | 捕获分组(可提取匹配内容) | "(ab)+" → "abab" (分组 "ab" ) |
(?:...) | 非捕获分组(不提取内容) | "(?:ab)+" → 匹配但不捕获 "ab" |
\n | 引用第 n 个分组(n=1,2,...) | "(a)\1" → "aa" (\1 引用 "a" ) |
6. 高级特性
符号 | 说明 | 示例 |
---|---|---|
(?=...) | 正向先行断言(后面必须匹配) | "a(?=b)" → "a" 后面必须跟 "b" |
(?!...) | 负向先行断言(后面不能匹配) | "a(?!b)" → "a" 后面不能是 "b" |
(?<=...) | 正向后行断言(前面必须匹配) | "(?<=a)b" → "b" 前面必须是 "a" |
(?<!...) | 负向后行断言(前面不能匹配) | "(?<!a)b" → "b" 前面不能是 "a" |
7. 常用正则示例
① 匹配邮箱
regex
/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i
^
开头,$
结尾。[a-z0-9._%+-]+
用户名部分(字母、数字、符号)。@
后接域名(如example.com
)。
② 匹配 URL
regex
/^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/\S*)?$/i
https?
匹配http
或https
。([\w.-]+)
域名(如google.com
)。(\/\S*)?
可选路径(如/path
)。
③ 匹配手机号(中国大陆)
regex
/^1[3-9]\d{9}$/
1
开头,第二位3-9
,后面接 9 位数字。
④ 提取 HTML 标签内容
regex
/<div>(.*?)<\/div>/
.*?
非贪婪匹配(匹配最短可能内容)。
8. 正则表达式修饰符
修饰符 | 说明 | 示例 |
---|---|---|
i | 不区分大小写 | /abc/i → "ABC" |
g | 全局匹配(JavaScript/Python 等) | /a/g 匹配所有 "a" |
m | 多行模式(^ 和 $ 匹配每行) | /^abc/m 匹配每行开头的 "abc" |
s | 单行模式(. 匹配换行符 \n ) | /a.b/s → "a\nb" |
9. 注意事项
- 贪婪 vs 非贪婪:
- 默认 贪婪匹配(
.*
匹配尽可能长的字符串)。 - 使用
.*?
实现 非贪婪匹配(匹配最短可能)。
- 默认 贪婪匹配(
- 性能优化:
- 避免嵌套量词(如
(a+)+
可能导致灾难性回溯)。 - 优先使用具体字符类(如
\d
代替[0-9]
)。
- 避免嵌套量词(如
- 兼容性:
- 不同语言(如 PHP、JavaScript、Python)的正则语法可能略有差异。