正则表达式入门:真正易懂的匹配模式
正则表达式语法的友好入门指南,涵盖验证与搜索的常用模式,以及如何轻松测试表达式。
正则表达式(regex)以难以阅读著称。但一旦掌握了基本构建模块,它就会成为开发者工具箱中最强大的工具之一——从验证用户输入到搜索日志文件,无所不能。
什么是正则表达式?
正则表达式是一种描述字符串集合的模式。你向正则引擎提供一个模式和一个目标字符串,它会告诉你该模式是否匹配(以及在哪里匹配)。
const pattern = /hello/i;
pattern.test("Hello World"); // true
/i 标志使匹配不区分大小写。在 JavaScript 中,标志写在结尾 / 之后。
核心构建模块
| 符号 | 含义 | 示例 | 匹配内容 |
|---|---|---|---|
. |
任意字符(换行符除外) | h.t |
hat, hit, hot |
* |
前一项零次或多次 | ab*c |
ac, abc, abbc |
+ |
前一项一次或多次 | ab+c |
abc, abbc(不含 ac) |
? |
前一项零次或一次 | colou?r |
color, colour |
\d |
任意数字(0–9) | \d{3} |
123, 007 |
\w |
单词字符(字母、数字、_) | \w+ |
hello, user_1 |
\s |
空白字符(空格、制表符、换行符) | \s+ |
匹配空格 |
^ |
字符串开头 | ^Hello |
Hello… |
$ |
字符串结尾 | world$ |
…world |
字符类
方括号定义一个用于匹配的字符集合:
[aeiou] — 任意元音字母
[A-Z] — 任意大写字母
[0-9a-f] — 任意十六进制数字
[^0-9] — 任意非数字字符
分组与alternation
圆括号用于对模式的某部分进行分组,| 表示"或":
(cat|dog)s? — 匹配 cat, cats, dog, dogs
(\d{3})-(\d{4}) — 匹配 555-1234 并捕获每个部分
捕获组在提取时非常有用——可以从杂乱的文本中提取电话号码、日期或 ID。
常见的实际应用模式
电子邮件(简化版)
^[^\s@]+@[^\s@]+\.[^\s@]+$
该模式检查"某内容 @ 某内容 . 某内容"的格式——对于客户端验证已足够。如需生产环境使用,请通过我们的 Email Validator 进行实际邮件投递验证。
URL
https?:\/\/[^\s/$.?#].[^\s]*
可匹配 http 和 https URL。如需构建有效的 URL,请参阅 URL & Query String Builder。
电话号码(美国)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
可匹配 (555) 123-4567、555.123.4567 和 555-123-4567 等格式。
日期(YYYY-MM-DD)
\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])
调试正则表达式
学习正则表达式的最佳方式是交互式测试。将你的模式和示例字符串粘贴到我们的 Regex Tester 中——它会实时高亮显示匹配结果、展示捕获组,并解释模式中每个部分的含义。
编写能解决问题的最简模式。"炫技"的正则表达式很难维护。
性能陷阱
灾难性回溯
像 (a+)+b 这样的嵌套量词,在输入不匹配时会导致引擎尝试指数级数量的路径。应避免同一字符可以被表达式多个部分同时匹配的模式。
锚定可节省时间
如果你知道模式应匹配整个字符串,请使用 ^ 和 $。不使用锚定时,引擎会扫描字符串中的每个位置以寻找部分匹配。
快速参考速查表
. 任意字符
\d \D 数字 / 非数字
\w \W 单词字符 / 非单词字符
\s \S 空白字符 / 非空白字符
[abc] 字符集
[^abc] 取反字符集
(group) 捕获组
(?:group) 非捕获组
a{3} 恰好 3 次
a{2,5} 2 到 5 次
a*? a+? 懒惰(非贪婪)版本
(?=ahead) 正向先行断言
(?!ahead) 负向先行断言
正则表达式是一项可以不断积累的技能。从简单模式开始,通过可视化方式测试,仅在必要时才增加复杂度。每种编程语言都支持正则表达式——一旦掌握语法,便可随处使用。