正则表达式教程:常用语法和匹配模式
正则表达式教程:常用语法和匹配模式
正则表达式 (Regular Expression),常被简称为 regex 或 regexp,是一种强大的文本处理工具,用于匹配、查找、替换符合特定模式的字符串。它像是一个强大的“通配符”,可以让你用简洁的表达式来描述复杂的文本规则。
本教程将带你了解正则表达式的常用语法和匹配模式,帮助你快速掌握这门利器。
一、 基本概念
正则表达式由普通字符和元字符组成:
- 普通字符: 字母、数字、汉字、下划线,以及没有特殊定义的标点符号。
- 元字符: 具有特殊含义的字符,用于构建更复杂的匹配模式。
二、 常用元字符
以下是一些常用的元字符及其含义:
| 元字符 | 描述 | 示例 | 匹配结果 |
| ------ | -------------------------------------------------- | ----------------- | --------------------- |
| .
| 匹配除换行符外的任意单个字符 | a.c
| "abc", "a1c", "a&c" |
| *
| 匹配前一个字符 0 次或多次 | ab*
| "a", "ab", "abbb" |
| +
| 匹配前一个字符 1 次或多次 | ab+
| "ab", "abbb" |
| ?
| 匹配前一个字符 0 次或 1 次 | ab?
| "a", "ab" |
| {n}
| 匹配前一个字符恰好 n 次 | ab{3}
| "abbb" |
| {n,}
| 匹配前一个字符至少 n 次 | ab{2,}
| "abb", "abbb" |
| {n,m}
| 匹配前一个字符 n 到 m 次 | ab{1,3}
| "ab", "abb", "abbb" |
| ^
| 匹配字符串的开头 | ^abc
| 以 "abc" 开头的字符串 |
| $
| 匹配字符串的结尾 | abc$
| 以 "abc" 结尾的字符串 |
| \
| 转义字符,使元字符失去特殊含义,匹配其本身 | \.
| 匹配 "." 本身 |
| []
| 字符集,匹配括号内的任意一个字符 | [abc]
| "a", "b", "c" |
| [^]
| 反向字符集,匹配不在括号内的任意一个字符 | [^abc]
| 除 "a", "b", "c" 外的字符 |
| -
| 在字符集中表示范围 | [a-z]
| 所有小写字母 |
| \|
| 或,匹配 \|
两侧的任意一个表达式 | cat\|dog
| "cat" 或 "dog" |
| ()
| 分组,将括号内的表达式作为一个整体 | (ab){2}
| "abab" |
| \d
| 匹配数字,等价于 [0-9]
| \d{3}
| 三个连续的数字 |
| \D
| 匹配非数字,等价于 [^0-9]
| \D
| 任意非数字字符 |
| \w
| 匹配字母、数字、下划线,等价于 [a-zA-Z0-9_]
| \w+
| 一个或多个单词字符 |
| \W
| 匹配非字母、数字、下划线,等价于 [^a-zA-Z0-9_]
| \W
| 任意非单词字符 |
| \s
| 匹配空白字符,包括空格、制表符、换行符等 | \s+
| 一个或多个空白字符 |
| \S
| 匹配非空白字符 | \S+
| 一个或多个非空白字符|
三、 常用匹配模式
-
贪婪模式 (Greedy): 默认情况下,
*
,+
,{n,m}
等量词会尽可能多地匹配字符。表达式: a.*b
文本: aabab
结果: aabab (匹配尽可能多的字符,直到最后一个 b) -
非贪婪模式 (Lazy/Reluctant): 在量词后面加上
?
,使其尽可能少地匹配字符。表达式: a.*?b
文本: aabab
结果: aab (匹配尽可能少的字符,遇到第一个 b 就停止) -
独占模式 (Possessive): 在量词后面加上
+
,与贪婪模式类似,尽可能多地匹配字符,但不会回溯。 在Java中使用较多,JS和Python不支持。独占模式可以用来提高匹配效率,防止因为回溯造成的性能问题,但使用时需要谨慎,因为可能会导致匹配失败。
四、 常见应用场景
- 数据校验: 验证用户输入的邮箱、手机号、身份证号等是否符合格式要求。
- 文本提取: 从 HTML 页面中提取标题、链接、图片地址等信息。
- 文本替换: 批量修改文本内容,例如将所有 "color" 替换为 "colour"。
- 日志分析: 从日志文件中提取关键信息,例如错误信息、访问 IP 等。
五、 进阶学习
本教程介绍了正则表达式的基础知识,还有更多高级的用法等待你探索,例如:
- 零宽断言 (Lookarounds): 用于指定匹配位置前后的内容,但不包含这些内容在匹配结果中。
- 反向引用 (Backreferences): 引用之前匹配到的分组内容。
- 命名分组 (Named Groups): 给分组命名,方便引用和理解。
六、 总结
正则表达式是一个强大的工具,熟练掌握它可以大幅提高文本处理的效率。希望本教程能够帮助你入门正则表达式,并在实际工作中运用自如。建议多加练习,并参考相关文档,不断深入学习。
记住,正则表达式的魅力在于灵活多变,同一个目标可能有多种不同的写法,找到最适合你的才是最好的!