正则表达式测试工具

输入正则表达式模式和测试字符串,即可高亮显示匹配部分并列出捕获组的值。支持 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 引擎解析你输入的模式和测试字符串,并在文本中把匹配到的部分用黄色高亮显示。同时还会列出每个捕获组的值、匹配总数以及语法错误信息,方便你一边微调模式一边确认"现在匹配到了哪里",整个试错过程都能在浏览器里完成,无需编写代码或搭建运行环境。

正则表达式测试工具的使用方法

  1. 输入正则表达式模式 在顶部的输入框中输入要测试的模式。前后的斜杠 / / 会自动补上,只需输入模式主体即可。
  2. 选择需要的标志 根据需要勾选 g、i、m、s、u 标志。如果想查看所有匹配项而不仅是第一个,请保持 g 标志开启。
  3. 输入测试字符串 将要匹配的文本粘贴到下方的文本框中,支持多行文本。
  4. 查看高亮结果和列表 每次输入都会自动重新计算,匹配到的部分会以黄色高亮显示。下方表格会逐条列出完整匹配和各捕获组的值。
  5. 调整模式 如果匹配数量或范围与预期不符,可以直接修改模式或标志,观察结果的变化来微调。

用好本工具的小技巧

  • 模式输入框右侧显示的 /标志 可以让你一眼确认当前启用了哪些标志组合。
  • 只有用 () 括起来的部分才算捕获组。如果只是想分组条件而不想让捕获组列表变得杂乱,可以使用非捕获组 (?:...)。
  • 不开启 g 标志时只会匹配第一处。如果想统计文本中所有出现的位置,请务必开启 g 标志。
  • 点击"插入示例"按钮可以加载邮箱地址提取的示例,是理解捕获组行为的一个很好的起点。
  • 本工具的所有匹配处理都在浏览器内完成,输入的模式和测试字符串不会发送到任何服务器。

正则表达式测试工具的应用场景

设计表单校验规则

在把正则表达式接入表单校验逻辑之前,先在这里验证预期的输入(是否带连字符、是否含全角字符等)能否通过,以及非法输入是否会被正确拦截。

从服务器日志中提取字段

把访问日志或错误日志的真实片段粘贴进来,构建出只提取IP地址、时间戳、状态码等特定字段的模式。

清洗CSV或文本数据

在统一格式不一致的电话号码或日期写法之前,可以用来分类确认哪些行匹配某个模式、哪些不匹配。

代码审查时确认行为

当同事写的正则表达式意图不易一眼看懂时,粘贴真实的样本值并可视化匹配范围,可以当场解决审查中的疑问。

检查修改模式的副作用

修改已有的正则表达式时,用同一份测试字符串对比修改前后的高亮结果,确认行为没有发生非预期的变化。

正则表达式相关术语表

捕获组
模式中用 () 括起来的部分。当你不仅需要整体匹配结果,还想单独取出其中一部分时使用。本工具的结果表会按"第1组""第2组"依次列出各组的值。
非捕获组
写作 (?:...) 形式的分组。如果只是想用括号把条件组合起来而不想影响捕获组编号,使用它可以让结果列表保持清晰。
反向引用
在同一模式中重复使用前面某个捕获组已匹配内容的写法。编号分组用 \1 引用,命名分组则用 \k<name> 引用,常用于检测连续重复的单词。
非贪婪匹配
在量词(如 *、+)后面加上 ?,会让匹配尽可能短。默认的贪婪匹配会尽可能匹配更长的内容,在提取单个HTML标签内容等需要限定范围的场景中,两者的区别非常关键。
先行断言与后行断言
(?=...)(正向先行断言)、(?!...)(负向先行断言)、(?<=...)(正向后行断言)、(?<!...)(负向后行断言)的统称。它们可以要求前后存在特定文本,但不会把该文本包含进匹配结果中。
字符类
用方括号括起来的一组字符,如 [abc] 或 [a-z0-9],表示匹配其中任意一个字符。在开头加上 ^,如 [^abc],则表示"不包含这些字符"。
锚点
不匹配具体字符,而是匹配位置的记法。^ 表示字符串(开启m标志时为每一行)的开头,$ 表示结尾,\b 表示单词边界。
标志
用来改变整个正则表达式解析方式的选项。本工具支持 g(查找所有匹配)、i(忽略大小写)、m(多行模式)、s(让点号也匹配换行符)、u(正确处理Unicode)这5种标志。

常见问题

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