正则表达式速查表与常用模式
正则表达式,或称 regex,是几乎所有编程语言和文本编辑器中使用的强大模式匹配工具。虽然语法乍看之下可能晦涩难懂,但掌握正则表达式可以让你以精确的方式搜索、验证、提取和转换文本,而这些操作用过程式代码可能需要几十行才能实现。本指南涵盖了你需要了解的基本语法、常用模式和实用技巧。
基本正则表达式语法速查表
字符类
| 模式 | 含义 | 示例 |
|---|---|---|
| . | 除换行符外的任意字符 | a.c 匹配 abc、a1c、a c |
| \d | 任意数字(0-9) | \d\d 匹配 42 |
| \D | 任意非数字 | \D 匹配 a、!、空格 |
| \w | 单词字符(a-z、A-Z、0-9、_) | \w+ 匹配 hello_123 |
| \W | 非单词字符 | \W 匹配 @、#、空格 |
| \s | 空白字符(空格、制表符、换行符) | a\sb 匹配 a b |
| \S | 非空白字符 | \S+ 匹配 hello |
| [abc] | 集合中的任意字符 | [aeiou] 匹配元音字母 |
| [^abc] | 不在集合中的任意字符 | [^0-9] 匹配非数字 |
| [a-z] | 字符范围 | [A-Za-z] 匹配任意字母 |
量词
| 模式 | 含义 | 示例 |
|---|---|---|
| * | 零次或多次 | ab*c 匹配 ac、abc、abbc |
| + | 一次或多次 | ab+c 匹配 abc、abbc |
| ? | 零次或一次 | colou?r 匹配 color、colour |
| {n} | 恰好 n 次 | \d{4} 匹配 4 位数字 |
| {n,} | n 次或更多 | \d{2,} 匹配 2 位及以上数字 |
| {n,m} | n 到 m 次 | \d{3,5} 匹配 3-5 位数字 |
锚点和边界
| 模式 | 含义 | 示例 |
|---|---|---|
| ^ | 字符串或行的开头 | ^Hello 匹配开头的 Hello |
| $ | 字符串或行的结尾 | world$ 匹配结尾的 world |
| \b | 单词边界 | \bcat\b 匹配单独的 cat |
| \B | 非单词边界 | \Bcat 匹配 scattered |
分组和交替
| 模式 | 含义 | 示例 |
|---|---|---|
| (abc) | 捕获组 | (ab)+ 匹配 abab |
| (?:abc) | 非捕获组 | (?:ab)+ 匹配 abab |
| a|b | 交替(或) | cat|dog 匹配 cat 或 dog |
| \1 | 对组 1 的反向引用 | (\w)\1 匹配 aa、bb |
| 命名捕获组 | 以 name 引用 |
常用正则表达式模式
以下是 Web 开发和数据验证中最常用的正则表达式模式:
电子邮件验证
一个实用的电子邮件正则表达式,可以捕获大多数无效地址而不会过于严格:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ 。此模式验证基本的电子邮件结构,同时允许本地部分中的常见字符,并要求具有至少两个字符的 TLD 的有效域名。
URL 验证
匹配 HTTP 和 HTTPS URL:^https?:\/\/(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(\/[^\s]*)?$ 。此模式匹配带有可选 www 前缀、域名和可选路径的 URL。
电话号码(美国)
美国电话号码的各种格式:^\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$ 。此模式处理 (555) 123-4567、555-123-4567 和 5551234567 等格式。
IP 地址(IPv4)
验证 IPv4 地址:^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$ 。此模式确保每个八位组在 0 到 255 之间。
日期(YYYY-MM-DD)
ISO 日期格式:^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ 。此模式验证格式结构但不检查每月的有效日期。
十六进制颜色代码
匹配 CSS 十六进制颜色:^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ 。此模式匹配 3 位简写(#fff)和 6 位(#ffffff)格式。
高级技巧
前瞻和后顾
前瞻和后顾断言让你仅在模式后面(或前面)有(或没有)另一个模式时才匹配,而不将周围的文本包含在匹配结果中。
- 正向前瞻 (?=pattern):仅在模式在后面时匹配。示例:\d(?=px) 仅匹配 "px" 前面的数字。
- 负向前瞻 (?!pattern):仅在模式不在后面时匹配。示例:\d(?!px) 匹配不在 "px" 前面的数字。
- <=pattern):仅在模式在前面时匹配。示例:(?<=\$)\d+ 匹配美元符号后面的数字。
贪婪与懒惰匹配
<.*>bold<.*?>"。
正则表达式性能提示
- 不需要提取匹配的组内容时使用非捕获组 (?:)
- 在支持的情况下使用占有量词或原子组来避免过度回溯
- 使用具体的字符类而非广泛使用点元字符
- 需要匹配整个字符串时用 ^ 和 $ 锚定你的模式
- 在循环中重复使用时预编译正则表达式模式
- 在较大文本中搜索时使用词边界 \b 代替 ^ 和 $
测试和调试正则表达式
在部署正则表达式模式之前,务必使用真实输入进行测试。使用可以实时高亮匹配并解释模式每个部分的交互式正则表达式测试器。这有助于你捕获边界情况并理解模式为何匹配或不匹配特定输入。试试我们免费的正则表达式测试器,交互式地构建和测试你的模式。
常见问题
贪婪和懒惰正则匹配有什么区别?
贪婪量词匹配尽可能多的文本,而懒惰量词匹配尽可能少的文本。在量词后添加问号使其变为懒惰的。例如,.* 匹配最长的可能字符串,而 .*? 匹配最短的。
正则表达式在所有编程语言中都一样吗?
不,正则表达式的实现因语言而异。大多数支持基本的 POSIX 语法,但高级功能如后顾、命名组和 Unicode 支持有所不同。JavaScript 历史上对正则表达式的支持有限,但近年来已添加了许多功能。
正则表达式可以解析 HTML 或 XML 吗?
不,正则表达式无法可靠地解析 HTML 或 XML,因为它们是嵌套的上下文无关语言。正则表达式没有嵌套深度或平衡标签的概念。请使用适当的 HTML 或 XML 解析器。正则表达式可以从 HTML 中提取简单模式,但在复杂结构上会失败。
正则表达式中的前瞻和后顾是什么?
<=pattern) 是正向后顾,如果模式在前面则匹配。否定版本使用 ! 代替 =。
如何让正则表达式不区分大小写?
在闭合分隔符后添加 i 标志使整个模式不区分大小写。在 JavaScript 中,使用 /pattern/i。在 Python 中,使用 re.IGNORECASE 或 re.I 作为标志。你也可以使用 (?i) 内联方式使特定部分不区分大小写。
ToolHub's collection of 300+ free online tools including regex tester, cheat sheets, and more — no sign-up required.