正则表达式教程:常用语法和匹配模式

正则表达式教程:常用语法和匹配模式

正则表达式 (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+ | 一个或多个非空白字符|

三、 常用匹配模式

  1. 贪婪模式 (Greedy): 默认情况下,*, +, {n,m} 等量词会尽可能多地匹配字符。

    表达式: a.*b
    文本: aabab
    结果: aabab (匹配尽可能多的字符,直到最后一个 b)

  2. 非贪婪模式 (Lazy/Reluctant): 在量词后面加上 ?,使其尽可能少地匹配字符。

    表达式: a.*?b
    文本: aabab
    结果: aab (匹配尽可能少的字符,遇到第一个 b 就停止)

  3. 独占模式 (Possessive): 在量词后面加上 +,与贪婪模式类似,尽可能多地匹配字符,但不会回溯。 在Java中使用较多,JS和Python不支持。

    独占模式可以用来提高匹配效率,防止因为回溯造成的性能问题,但使用时需要谨慎,因为可能会导致匹配失败。

四、 常见应用场景

  1. 数据校验: 验证用户输入的邮箱、手机号、身份证号等是否符合格式要求。
  2. 文本提取: 从 HTML 页面中提取标题、链接、图片地址等信息。
  3. 文本替换: 批量修改文本内容,例如将所有 "color" 替换为 "colour"。
  4. 日志分析: 从日志文件中提取关键信息,例如错误信息、访问 IP 等。

五、 进阶学习

本教程介绍了正则表达式的基础知识,还有更多高级的用法等待你探索,例如:

  • 零宽断言 (Lookarounds): 用于指定匹配位置前后的内容,但不包含这些内容在匹配结果中。
  • 反向引用 (Backreferences): 引用之前匹配到的分组内容。
  • 命名分组 (Named Groups): 给分组命名,方便引用和理解。

六、 总结

正则表达式是一个强大的工具,熟练掌握它可以大幅提高文本处理的效率。希望本教程能够帮助你入门正则表达式,并在实际工作中运用自如。建议多加练习,并参考相关文档,不断深入学习。

记住,正则表达式的魅力在于灵活多变,同一个目标可能有多种不同的写法,找到最适合你的才是最好的!

THE END