正则表达式
正则表达式详细说明
一、正则表达式基础概念
正则表达式(Regular Expression,简称 Regex 或 RegExp)是一种用于匹配和处理文本的强大工具,它通过特定的字符组合来描述文本模式。在编程、文本编辑器、命令行工具等场景中广泛应用,可用于文本搜索、替换、验证等操作。
二、正则表达式基本语法
1. 普通字符
-
定义:直接匹配字符本身,包括字母、数字、标点符号等。
-
示例
:
abc:匹配字符串中的abc子串。123:匹配数字123。
2. 特殊字符(元字符)
元字符具有特殊含义,需配合转义符\使用才能匹配字面量。
| 元字符 | 含义 | 示例 |
|---|---|---|
. |
匹配任意单个字符(除换行符\n外) |
a.c可匹配abc、a0c,但不匹配a\nc |
^ |
匹配字符串开头 | ^abc仅匹配以abc开头的字符串 |
| ` | 元字符 | 含义 |
| ------- | ------------------------------------ | -------------------------------------------- |
. |
匹配任意单个字符(除换行符\n外) |
a.c可匹配abc、a0c,但不匹配a\nc |
^ |
匹配字符串开头 | ^abc仅匹配以abc开头的字符串 |
\| 匹配字符串结尾 \| `abc$`仅匹配以`abc`结尾的字符串 |
| * | 匹配前一个元素 0 次或多次 | a*b可匹配b(a 出现 0 次)、ab、aab等 |
| + | 匹配前一个元素 1 次或多次 | a+b可匹配ab、aab,但不匹配b |
| ? | 匹配前一个元素 0 次或 1 次 | a?b可匹配b、ab |
| {n} | 匹配前一个元素恰好 n 次 | a{2}b匹配aab |
| {n,} | 匹配前一个元素至少 n 次 | a{2,}b匹配aab、aaab等 |
| {n,m} | 匹配前一个元素 n 到 m 次 | a{1,3}b匹配ab、aab、aaab |
| [] | 字符集合,匹配其中任意一个字符 | [abc]匹配a、b或c |
| [^] | 否定字符集合,匹配不在其中的任意字符 | [^abc]匹配除a、b、c外的字符 |
| \ | 转义符,使元字符变为普通字符 | \.匹配.,\*匹配* |
3. 预定义字符类
为常见字符集合提供简写形式:
| 字符类 | 等价形式 | 含义 |
|---|---|---|
\d |
[0-9] |
匹配数字 |
\D |
[^0-9] |
匹配非数字 |
\w |
[a-zA-Z0-9_] |
匹配字母、数字或下划线 |
\W |
[^a-zA-Z0-9_] |
匹配非字母、数字或下划线 |
\s |
[ \t\n\r\f\v] |
匹配空白字符(空格、制表符、换行符等) |
\S |
[^ \t\n\r\f\v] |
匹配非空白字符 |
4. 分组与反向引用
-
分组
:使用
()将多个元素组合为一个整体,可对分组应用量词。
- 示例:
(ab)+匹配ab、abab、ababab等。
- 示例:
-
反向引用
:通过
\n(n 为数字)引用分组内容,用于匹配重复模式。
- 示例:
(\d)\1匹配两个连续相同数字(如11、22)。
- 示例:
三、正则表达式高级用法
1. 贪婪匹配与非贪婪匹配
-
贪婪匹配
:默认模式,尽可能多地匹配内容(使用
*、
+、
?、
{n,})。
- 示例:
a.*b匹配a123b456b时,会匹配整个a123b456b。
- 示例:
-
非贪婪匹配
:在量词后加
?,尽可能少地匹配内容。
- 示例:
a.*?b匹配a123b456b时,仅匹配a123b。
- 示例:
2. 零宽断言(环视)
用于指定匹配的位置,不消耗字符:
| 断言类型 | 语法 | 含义 |
|---|---|---|
| 正向先行断言 | (?=pattern) |
匹配右侧是pattern的位置 |
| 负向先行断言 | (?!pattern) |
匹配右侧不是pattern的位置 |
| 正向后发断言 | (?<=pattern) |
匹配左侧是pattern的位置 |
| 负向后发断言 | (?<!pattern) |
匹配左侧不是pattern的位置 |
- 示例:
\d+(?=元)匹配价格(如100元中的100)。
3. 分支结构
使用|表示 “或” 关系,按顺序匹配分支。
- 示例:
(https?|ftp)://匹配http://、https://或ftp://。
四、正则表达式应用场景
1. 文本验证
-
邮箱验证
:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$- 解释:匹配用户名(字母、数字、特殊符号)+@+ 域名 + 后缀。
-
手机号验证(中国大陆)
:
^1[3-9]\d{9}$- 解释:以 1 开头,第二位为 3-9,后跟 9 位数字。
2. 文本提取
-
提取 URL
:
https?://[^\s/$.?#].[^\s]*- 解释:匹配 http/https 开头的网址,排除空格和特殊符号。
3. 文本替换
-
将驼峰命名转为下划线命名
([A-Z])替换为
_$1,并转为小写。
- 示例:
驼峰命名HumpName→驼峰命名_hump_name。
- 示例:
五、正则表达式工具与注意事项
1. 常用工具
2. 注意事项
- 转义字符:在编程语言中使用正则时,需注意双重转义(如 Python 中
\\d表示\d)。 - 性能优化:避免过度复杂的正则(如嵌套过多分组),可能导致匹配效率低下。
- 跨平台差异:不同语言 / 工具对正则的支持可能有细微差异(如换行符处理)。
六、正则表达式示例解析
示例 1:匹配 HTML 标签
- 正则:
<(\w+)>.*?</\1> - 解析:
<(\w+)>:匹配开始标签(如<div>),分组 1 捕获标签名。.*?:非贪婪匹配标签内容。</\1>:匹配结束标签,\1引用分组 1 的标签名(如</div>)。
- 限制:无法处理嵌套标签(如
<div><span>text</span></div>),需使用更复杂的正则或 HTML 解析库。
示例 2:匹配日期(YYYY-MM-DD)
- 正则:
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ - 解析:
\d{4}:匹配 4 位年份。-(0[1-9]|1[0-2]):匹配月份(1-12)。-(0[1-9]|[12]\d|3[01]):匹配日期(1-31)。
七、正则表达式学习资源
- 书籍:《精通正则表达式》(Jeffrey E. F. Friedl)
- 教程:W3Schools 正则表达式教程
- 练习平台:Regex Crossword(通过游戏练习正则)
通过组合上述语法和技巧,可构建复杂的文本处理规则。实际应用中建议先拆分需求,逐步构建正则表达式,并通过工具测试验证效果。

浙公网安备 33010602011771号