正则表达式测试工具
输入正则表达式模式和测试字符串,即可高亮显示匹配部分并列出捕获组的值。支持 g/i/m/s/u 标志,直接使用 JavaScript 原生 RegExp。
常用正则表达式模式一览
| 用途 | 模式 | 说明 |
|---|---|---|
| 邮箱地址 | ^[\w.+-]+@[\w-]+\.[\w.-]+$ | 匹配由用户名和域名以 @ 分隔组成的简化邮箱地址格式(并非完全符合 RFC 规范)。 |
| 中国大陆手机号 | ^1[3-9]\d{9}$ | 匹配以1开头、第二位为3-9的11位中国大陆手机号码。 |
| URL 网址 | https?:\/\/[\w.-]+(?:\/[\w\-./?%&=]*)? | 提取以 http:// 或 https:// 开头的网址字符串,包含路径和查询参数。 |
| 中国邮政编码 | ^\d{6}$ | 匹配由6位数字组成的中国邮政编码。 |
| HEX 颜色代码 | ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$ | 匹配 CSS 中使用的完整 #RRGGBB 格式或简写 #RGB 格式的颜色代码。 |
| 仅限数字 | ^[0-9]+$ | 验证字符串是否完全由半角数字(0-9)组成。 |
什么是正则表达式测试工具
正则表达式(Regular Expression)是一种紧凑的迷你语言,用来在文本中搜索、提取和校验特定模式。"判断一个字符串是否符合邮箱地址格式""从日志中只取出IP地址"这类任务,都可以用一条模式表达出来。但它的符号组合比较独特,仅凭肉眼阅读很难判断模式是否会按预期运行。
本工具会即时用 JavaScript 原生的 RegExp 引擎解析你输入的模式和测试字符串,并在文本中把匹配到的部分用黄色高亮显示。同时还会列出每个捕获组的值、匹配总数以及语法错误信息,方便你一边微调模式一边确认"现在匹配到了哪里",整个试错过程都能在浏览器里完成,无需编写代码或搭建运行环境。
正则表达式测试工具的使用方法
-
输入正则表达式模式
在顶部的输入框中输入要测试的模式。前后的斜杠
/ /会自动补上,只需输入模式主体即可。 - 选择需要的标志 根据需要勾选 g、i、m、s、u 标志。如果想查看所有匹配项而不仅是第一个,请保持 g 标志开启。
- 输入测试字符串 将要匹配的文本粘贴到下方的文本框中,支持多行文本。
- 查看高亮结果和列表 每次输入都会自动重新计算,匹配到的部分会以黄色高亮显示。下方表格会逐条列出完整匹配和各捕获组的值。
- 调整模式 如果匹配数量或范围与预期不符,可以直接修改模式或标志,观察结果的变化来微调。
用好本工具的小技巧
- 模式输入框右侧显示的
/标志可以让你一眼确认当前启用了哪些标志组合。 - 只有用
()括起来的部分才算捕获组。如果只是想分组条件而不想让捕获组列表变得杂乱,可以使用非捕获组(?:...)。 - 不开启 g 标志时只会匹配第一处。如果想统计文本中所有出现的位置,请务必开启 g 标志。
- 点击"插入示例"按钮可以加载邮箱地址提取的示例,是理解捕获组行为的一个很好的起点。
- 本工具的所有匹配处理都在浏览器内完成,输入的模式和测试字符串不会发送到任何服务器。
正则表达式测试工具的应用场景
设计表单校验规则
在把正则表达式接入表单校验逻辑之前,先在这里验证预期的输入(是否带连字符、是否含全角字符等)能否通过,以及非法输入是否会被正确拦截。
从服务器日志中提取字段
把访问日志或错误日志的真实片段粘贴进来,构建出只提取IP地址、时间戳、状态码等特定字段的模式。
清洗CSV或文本数据
在统一格式不一致的电话号码或日期写法之前,可以用来分类确认哪些行匹配某个模式、哪些不匹配。
代码审查时确认行为
当同事写的正则表达式意图不易一眼看懂时,粘贴真实的样本值并可视化匹配范围,可以当场解决审查中的疑问。
检查修改模式的副作用
修改已有的正则表达式时,用同一份测试字符串对比修改前后的高亮结果,确认行为没有发生非预期的变化。
正则表达式相关术语表
- 捕获组
- 模式中用
()括起来的部分。当你不仅需要整体匹配结果,还想单独取出其中一部分时使用。本工具的结果表会按"第1组""第2组"依次列出各组的值。 - 非捕获组
- 写作
(?:...)形式的分组。如果只是想用括号把条件组合起来而不想影响捕获组编号,使用它可以让结果列表保持清晰。 - 反向引用
- 在同一模式中重复使用前面某个捕获组已匹配内容的写法。编号分组用
\1引用,命名分组则用\k<name>引用,常用于检测连续重复的单词。 - 非贪婪匹配
- 在量词(如
*、+)后面加上?,会让匹配尽可能短。默认的贪婪匹配会尽可能匹配更长的内容,在提取单个HTML标签内容等需要限定范围的场景中,两者的区别非常关键。 - 先行断言与后行断言
(?=...)(正向先行断言)、(?!...)(负向先行断言)、(?<=...)(正向后行断言)、(?<!...)(负向后行断言)的统称。它们可以要求前后存在特定文本,但不会把该文本包含进匹配结果中。- 字符类
- 用方括号括起来的一组字符,如
[abc]或[a-z0-9],表示匹配其中任意一个字符。在开头加上^,如[^abc],则表示"不包含这些字符"。 - 锚点
- 不匹配具体字符,而是匹配位置的记法。
^表示字符串(开启m标志时为每一行)的开头,$表示结尾,\b表示单词边界。 - 标志
- 用来改变整个正则表达式解析方式的选项。本工具支持 g(查找所有匹配)、i(忽略大小写)、m(多行模式)、s(让点号也匹配换行符)、u(正确处理Unicode)这5种标志。
常见问题
[abc]、\d、+、* 等)大体相通,但命名分组的写法、先行/后行断言的支持情况以及可用标志在不同语言之间存在细微差异。本工具遵循 JavaScript 的 RegExp 规范,不保证在其他语言中行为完全一致。*、+、?)前面没有可修饰的对象,或字符类写法不合法等。错误信息通常会给出提示,请检查括号是否配对、特殊字符是否已正确转义(如 \. 或 \()。
闲话 ― 正则表达式引擎内部发生了什么
正则表达式的理论源头可以追溯到20世纪50年代数学家斯蒂芬·克莱尼(Stephen Kleene)提出的"正则语言"理论。早期 Unix 的文本编辑器 ed 以及命令 grep(globally search a Regular Expression and Print 的缩写)将这套理论落地为实用工具,这也是正则表达式能在文本处理工具中迅速普及的原因之一。grep 这个名字本身就源自一条正则表达式操作命令,颇具象征意义。
JavaScript 的 RegExp 引擎内部采用"回溯法"进行匹配:按顺序尝试模式中的每个元素,一旦某部分失败就退回上一步重新尝试。这种方式虽然灵活,但像 (a+)+b 这样的模式配合较长的不匹配字符串时,尝试次数可能呈指数级增长,即所谓的"灾难性回溯(catastrophic backtracking)",严重时会导致浏览器或服务器卡死。在生产代码中使用复杂模式前,务必用各种输入进行充分测试。
带有全局(g)标志的正则表达式对象内部会保存一个名为 lastIndex 的游标,每次调用 exec() 都会从该位置继续搜索。如果重复使用同一个正则对象进行不相关的搜索,这个游标可能会遗留意外状态,因此本工具每次都会创建全新的 RegExp 实例,以避免状态被意外带入下一次匹配。
命名捕获组((?<name>...))是 ECMAScript 2018 新增的相对较新的特性。用名称而非编号引用分组,能大幅提升复杂模式的可读性,在解析日期等需要明确"每个分组代表什么"的场景中尤其有用。