一、基础语法(逐字符解析)
1. 普通字符
- 规则:直接匹配字符本身,无特殊含义。
- 示例:
hello
→ 精准匹配字符串 “hello” a1@
→ 匹配 “a” + 数字 “1” + 符号 “@” 的组合
2. 元字符(核心符号)
符号 |
详细解释 |
案例与场景 |
. |
匹配任意一个字符(如字母、数字、符号),但不能匹配换行符(\n ) |
h.llo → 匹配 “hello”、“h3llo”、“h@llo” 等 |
^ |
匹配字符串的开头位置,不消耗字符 |
^start → 字符串必须以 “start” 开头(如 “start123” 匹配,“123start” 不匹配) |
$ |
匹配字符串的结尾位置,不消耗字符 |
end$ → 字符串必须以 “end” 结尾(如 “123end” 匹配,“end123” 不匹配) |
\ |
转义符,将特殊字符变为普通字符 |
\. → 匹配 “.” 本身(如 “file.txt” 中的 “.”)\\ → 匹配 “” 符号本身 |
\d |
匹配任意一个数字(等价于 [0-9] ) |
\d\d → 匹配 “12”、“34” 等两位连续数字 |
\w |
匹配字母、数字、下划线(等价于 [a-z0-9_] ) |
\w+ → 匹配连续字母/数字/下划线(如 “user_123”) |
\s |
匹配空白字符(包括空格、制表符 \t 、换行符 \n 等) |
a\sb → 匹配 “a b”(中间有空格)、“a\tb”(中间有制表符) |
\b |
匹配单词边界(单词与空格/标点的交界处) |
\bcat\b → 匹配独立的单词 “cat”(如 “cat” 匹配,“category” 不匹配) |
3. 字符集合(灵活匹配)
语法 |
详细解释 |
案例与场景 |
[abc] |
匹配方括号内的任意一个字符 |
[aeiou] → 匹配任意元音字母(如 “apple” 中的 “a” 和 “e”) |
[a-z] |
匹配指定范围内的字符(支持连字符 - ) |
[0-9A-F] → 匹配十六进制字符(0-9、A-F) |
[^abc] |
排除方括号内的字符(^ 在开头表示否定) |
[^0-9] → 匹配非数字字符(如 “a”、“@”) |
4. 量词(控制重复次数)
符号 |
详细解释 |
案例与场景 |
\* |
前一个字符出现 0次或多次(贪婪模式) |
ab*c → 匹配 “ac”(b出现0次)、“abbc”(b出现2次) |
+ |
前一个字符出现 1次或多次(至少一次) |
a+ → 匹配 “a”、“aaa”,但不匹配空字符串 |
? |
前一个字符出现 0次或1次(可选匹配) |
https? → 匹配 “http”(s出现0次)和 “https”(s出现1次) |
{n} |
前一个字符 精确出现n次 |
\d{4} → 匹配4位数字(如年份 “2024”) |
{n,} |
前一个字符 至少出现n次 |
\w{5,} → 匹配至少5位字母/数字(如 “hello123”) |
{n,m} |
前一个字符 出现n到m次 |
a{2,4} → 匹配 “aa”、“aaa”、“aaaa” |
二、进阶语法(复杂规则)
1. 分组与引用
语法 |
详细解释 |
案例与场景 |
( ) |
分组:将多个字符视为一个整体,可用于提取或复用 |
(ab)+ → 匹配 “abab”(分组整体重复两次) |
\1 |
反向引用:引用第1个分组的匹配结果(按括号顺序编号) |
(\w+)\s+\1 → 匹配重复单词(如 “hello hello” 中的两个 “hello”) |
2. 逻辑选择
语法 |
详细解释 |
案例与场景 |
**` |
`** |
逻辑或:匹配左侧或右侧的任意一种模式 |
3. 边界与断言
语法 |
详细解释 |
案例与场景 |
\B |
匹配非单词边界(单词内部位置) |
\Bcat\B → 匹配 “scatter” 中的 “cat”(不在单词边界) |
(?=...) |
正向先行断言:右侧必须满足条件,但不消耗字符 |
\d+(?=元) → 匹配 “100元” 中的 “100”(后面必须有 “元”) |
(?<=...) |
正向后行断言:左侧必须满足条件,但不消耗字符 |
(?<=\$)\d+ → 匹配 “100"中的"100”(前面必须有"100"中的"100"(前面必须有"") |
三、高级语法(精准控制)
1. 贪婪与懒惰模式
模式 |
语法 |
详细解释 |
案例对比 |
贪婪模式 |
.* 或 .+ |
尽可能多匹配,直到无法满足条件 |
a.*b → 在 “a1b2b3” 中匹配整个字符串 “a1b2b” |
懒惰模式 |
.*? 或 .+? |
尽可能少匹配,一旦满足即停止 |
a.*?b → 在 “a1b2b” 中仅匹配 “a1b” |
2. 非捕获分组
语法 |
详细解释 |
案例与场景 |
(?:...) |
分组但不记录匹配内容(节省内存,提高性能) |
(?:ab)+ → 匹配 “abab”,但无法用 \1 引用分组 |
3. 否定断言
语法 |
详细解释 |
案例与场景 |
(?!...) |
负向先行断言:右侧不能出现指定模式 |
\d{3}(?!-) → 匹配3位数字且后面没有 “-”(如 “123” 匹配,“123-” 不匹配) |
(?<!...) |
负向后行断言:左侧不能出现指定模式 |
(?<!\$)\d+ → 匹配前面没有 "“的数字(如"100"匹配,”"的数字(如"100"匹配,“100” 不匹配) |
4. 模式修饰符
修饰符 |
详细解释 |
案例与场景 |
i |
忽略大小写 |
/hello/i → 匹配 “HELLO”、“Hello” |
m |
多行模式:使 ^ 和 $ 匹配每行的开头和结尾 |
/^start/m → 在多行文本中匹配每行的 “start” |
s |
单行模式:允许 . 匹配换行符(\n ) |
/.*/s → 跨行匹配所有内容(包括换行符) |
四、实战案例解析
1. 匹配电子邮箱
^[\w.-]+@([\w-]+\.)+[\w-]+$
- 分步解析:
^[\w.-]+
→ 用户名部分(字母/数字/下划线/点/连字符)
@
→ 必须包含 “@” 符号
([\w-]+\.)+
→ 域名前缀(如 “gmail.”、“yahoo.”)
[\w-]+$
→ 顶级域名(如 “com”、“org”)
2. 提取HTML标签内容
<(\w+)>(.*?)</\1>
- 分步解析:
<(\w+)>
→ 匹配开始标签(如 <div>
,分组捕获标签名)
(.*?)
→ 懒惰模式匹配标签内容
</\1>
→ 匹配结束标签(如 </div>
,\1
引用分组确保标签名一致)