正则表达式测试工具
输入正则表达式模式和测试字符串,即可高亮显示匹配部分并列出捕获组的值。支持 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)组成。 |
使用提示
- 模式输入框右侧显示的
/标志可以让你一眼确认当前启用了哪些标志组合。 - 只有用
()括起来的部分才算捕获组。如果只是想分组条件而不想让捕获组列表变得杂乱,可以使用非捕获组(?:...)。 - 不开启 g 标志时只会匹配第一处。如果想统计文本中所有出现的位置,请务必开启 g 标志。
- 点击"插入示例"按钮可以加载邮箱地址提取的示例,是理解捕获组行为的一个很好的起点。
- 本工具的所有匹配处理都在浏览器内完成,输入的模式和测试字符串不会发送到任何服务器。
常见问题
[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 新增的相对较新的特性。用名称而非编号引用分组,能大幅提升复杂模式的可读性,在解析日期等需要明确"每个分组代表什么"的场景中尤其有用。