Skip to content
xiaoyang 的头像xiaoyang发布于 2025-03-033,041 字阅读约 10 分钟浏览加载中

正则表达式(Regex) ​

正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串的强大工具,在文本搜索、数据提取、字符串替换等领域广泛应用。本教程将从基础到高级,系统介绍正则表达式的使用方法。


1. 正则表达式基础 ​

1.1 什么是正则表达式? ​

正则表达式是一种模式(Pattern),用于匹配文本中的特定字符串。它可以用于:

  • 搜索(查找符合特定规则的文本)
  • 匹配(判断字符串是否符合规则)
  • 替换(修改符合规则的文本)

在Python、JavaScript、Java等多种编程语言中,正则表达式都有相应的支持库。

1.2 正则表达式基本语法 ​

符号含义示例
.匹配任意单个字符(除换行符)c.t 可匹配 cat, cut, c1t 等
^匹配字符串的开头^hello 可匹配 "hello world" 但不匹配 "hi hello"
$匹配字符串的结尾world$ 可匹配 "hello world" 但不匹配 "world hello"
*匹配前一个字符 0 次或多次ab*c 可匹配 "ac", "abc", "abbc"
+匹配前一个字符 1 次或多次ab+c 可匹配 "abc", "abbc",但不匹配 "ac"
?匹配前一个字符 0 次或1次ab?c 可匹配 "ac" 和 "abc"
{n}匹配前一个字符 n 次a{3} 只匹配 "aaa"
{n,}匹配前一个字符 至少 n 次a{2,} 匹配 "aa", "aaa", "aaaa"
{n,m}匹配前一个字符 n 到 m 次a{2,4} 匹配 "aa", "aaa", "aaaa"
[]匹配括号中的任意字符[abc] 可匹配 "a", "b", "c"
``逻辑“或”
\转义特殊字符\. 可匹配 .(点)本身

2. 字符类(Character Classes) ​

字符类用于定义一组可匹配的字符。

字符类含义示例
[abc]匹配 a、b 或 c[ch]at 可匹配 "cat" 或 "hat"
[^abc]非 a、b、c[^0-9] 匹配非数字字符
[a-z]匹配小写字母[a-zA-Z] 匹配所有英文字母
[0-9]匹配数字[0-9]+ 匹配 "123", "456"
.匹配任意字符(除换行)a.c 可匹配 "abc",但不匹配 "ac"

3. 预定义字符 ​

正则表达式提供了一些预定义的字符,代表常见的字符类型。

预定义字符含义示例
\d数字 [0-9]\d+ 匹配 "123", "42"
\D非数字 [^0-9]\D+ 匹配 "abc", "XYZ"
\w单词字符 [a-zA-Z0-9_]\w+ 匹配 "hello", "world_123"
\W非单词字符 [^a-zA-Z0-9_]\W+ 匹配 "@#$%!"
\s空白字符(空格、制表符、换行符)\s+ 可匹配 " "
\S非空白字符\S+ 可匹配 "hello"

4. 分组(Grouping)与引用 ​

4.1 捕获组(Capturing Groups) ​

用小括号 () 将部分模式分组,以便引用。

示例:

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

匹配 "123-45-6789",并捕获:

  • \1:123
  • \2:45
  • \3:6789

4.2 反向引用 ​

在替换或匹配中,可用 \1 引用之前匹配的组。

示例:

regex
(\w+)\s\1

可匹配 "hello hello"(重复单词)。


5. 贪婪与惰性匹配 ​

模式匹配规则
.*贪婪匹配(尽可能多匹配)
.*?惰性匹配(尽可能少匹配)

示例:

regex
<.*>

匹配 <div>hello</div>,但会匹配整个 <div>hello</div>。

如果使用:

regex
<.*?>

则只匹配 <div>。


6. 断言(Assertions) ​

6.1 位置匹配 ​

断言含义示例
^开头匹配^hello 只匹配 "hello world"
$结尾匹配world$ 只匹配 "hello world"
\b单词边界\bcat\b 只匹配 " cat "
\B非单词边界\Bcat\B 不匹配 " cat "

6.2 前后向断言 ​

断言描述示例
(?=...)正向预查(后面必须是...)\d(?=px) 匹配 "10px" 中的 10
(?!...)负向预查(后面不能是...)\d(?!px) 匹配 "10kg" 中的 10
(?<=...)正向回顾(前面必须是...)(?<=\$)\d+ 匹配 "$100" 中的 100
(?<!...)负向回顾(前面不能是...)(?<!\$)\d+ 不匹配 "$100"

7. 实践案例 ​

7.1 邮箱验证 ​

regex
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

7.2 手机号匹配 ​

regex
^1[3-9]\d{9}$

7.3 URL 匹配 ​

regex
https?:\/\/(www\.)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/.*)?$
DISCUSSION

评论区

欢迎分享你的思考、补充或问题。

基于 VitePress 搭建