正则表达式的基本语法

语法符号 说明 例子 匹配
. 匹配任意单个字符(除了换行符) a.b acba1b
\d 匹配任意数字,等价于 [0-9] \d{3} 123456
\w 匹配字母、数字、下划线,等价于 [a-zA-Z0-9_] \w+ abc_123
\s 匹配任何空白字符(空格、制表符等) \s 空格、\t
/g 匹配所有 "abcabc".match(/a/g) ["a", "a"]
^ 匹配字符串开头 ^Hello Hello world
$ 匹配字符串结尾 world$ Hello world
* 匹配前面的字符零次或多次 a* ``, a, aaaa
+ 匹配前面的字符一次或多次 a+ a, aaaa
? 匹配前面的字符零次或一次 a? ``, a
{n} 精确匹配 n 次 a{3} aaa
{n,} 匹配至少 n 次 a{2,} aa, aaa
{n,m} 匹配 n 到 m 次 a{2,4} aa, aaa, aaaa
[] 字符集合,匹配方括号内任意一个字符 [abc] a, b, c
[^] 不匹配括号内的任何字符 "abcXYZ".match(/[^a-c]/g) ["X", "Y", "Z"]
` ` 或操作 `a

3. 分组与捕获

  • 分组 ( ... )
    将多个字符组合成一个单元,方便整体匹配和提取。

  • 非捕获分组 (?: ... )
    用于分组但不捕获内容,减少内存开销。

  • 捕获组编号
    按左括号出现顺序编号,从1开始,通过编程语言接口获取匹配内容。

示例:匹配日期格式 YYYY-MM-DD

(\d{4})-(\d{2})-(\d{2})

匹配 2024-06-15,分别捕获年、月、日。


4. 常用特殊字符转义

正则表达式中一些字符有特殊含义,如 . ^ $ * + ? { } [ ] \ | ( ),如果要匹配这些字符本身,需使用反斜杠 \ 进行转义。

例如,匹配字符串 a+b

a\+b

5. 零宽断言(Lookahead 和 Lookbehind)

  • 正向预查(Lookahead) (?=...)
    匹配后面跟着某模式的字符串,但不消耗字符。

  • 负向预查 (?!...)
    匹配后面不跟某模式的字符串。

  • 正向回顾(Lookbehind) (?<=...)
    匹配前面是某模式的字符串。

  • 负向回顾 (?<!...)

示例: 匹配后面跟着 ing 的单词 play

play(?=ing)

6. 实战示例

6.1 验证邮箱地址

^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
  • ^ 开头
  • [a-zA-Z0-9_.+-]+ 用户名部分
  • @ 符号
  • [a-zA-Z0-9-]+ 域名部分
  • \. 点符号
  • [a-zA-Z0-9-.]+ 顶级域名部分
  • $ 结尾

6.2 提取网页中的所有链接

<a\s+(?:[^>]*?\s+)?href="([^"]*)"
  • 匹配 <a> 标签中 href 属性的链接地址。

7. 常用正则表达式工具和资源