正则表达式测试工具

输入正则表达式模式和测试字符串,即可高亮显示匹配部分并列出捕获组的值。支持 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 标志。
  • 点击"插入示例"按钮可以加载邮箱地址提取的示例,是理解捕获组行为的一个很好的起点。
  • 本工具的所有匹配处理都在浏览器内完成,输入的模式和测试字符串不会发送到任何服务器。

常见问题

如果不加 g(global)标志,正则表达式只会匹配字符串中的第一处,之后出现的匹配都会被忽略。如果想找出所有匹配项,请务必开启 g 标志。

基本语法([abc]\d+* 等)大体相通,但命名分组的写法、先行/后行断言的支持情况以及可用标志在不同语言之间存在细微差异。本工具遵循 JavaScript 的 RegExp 规范,不保证在其他语言中行为完全一致。

不会。所有处理都在浏览器内的 JavaScript 中完成,输入内容不会发送或保存到 toolbase.cc 的服务器。

当 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 新增的相对较新的特性。用名称而非编号引用分组,能大幅提升复杂模式的可读性,在解析日期等需要明确"每个分组代表什么"的场景中尤其有用。

→ 查看全部趣味知识