Developer Tools

正则表达式入门:真正易懂的匹配模式

正则表达式语法的友好入门指南,涵盖验证与搜索的常用模式,以及如何轻松测试表达式。

7分钟阅读

笔记本屏幕上的代码

正则表达式(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]*

可匹配 httphttps URL。如需构建有效的 URL,请参阅 URL & Query String Builder

电话号码(美国)

\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}

可匹配 (555) 123-4567555.123.4567555-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)   负向先行断言

正则表达式是一项可以不断积累的技能。从简单模式开始,通过可视化方式测试,仅在必要时才增加复杂度。每种编程语言都支持正则表达式——一旦掌握语法,便可随处使用。