CodeKitHub
文本工具

正则表达式在线测试

最后更新:

输入正则表达式,测试文本中的匹配会实时高亮显示。每个匹配的捕获分组单独列出,支持所有 JavaScript 正则标志。写代码前先在这里调试好你的正则。

//

    工具介绍

    正则表达式(regex)是一种查找、校验和提取文本的紧凑模式语言:邮箱模式可以校验表单输入,\d{4}-\d{2}-\d{2} 能找出日期,捕获分组则提取你需要的部分。几乎所有编程语言和编辑器都支持正则。

    本工具使用 JavaScript 正则引擎——与 Node.js 和所有浏览器中运行的完全相同——所以在这里调试好的模式,放进你的 JavaScript/TypeScript 代码中行为完全一致。大多数模式在 Python、Java、Go 中也无需修改。

    为什么使用它?

    • 实时反馈:边输入模式,匹配结果边用黄色高亮。
    • 逐个显示捕获分组——清楚看到 $1、$2 会是什么内容。
    • 完整标志支持:g(全部匹配)、i(忽略大小写)、m(多行)、s(点号匹配换行)、u(Unicode)。
    • 模式有语法错误时给出清晰的错误提示。
    • 免费且私密——模式和文本都不离开浏览器。

    使用方法

    1. 在两个 / 之间输入你的正则模式(不需要自己转义斜杠)。
    2. 在第二个 / 后面的小框中调整标志——默认 g 表示找出全部匹配。
    3. 在下方粘贴测试文本。
    4. 匹配即时高亮;捕获分组列在下面。
    5. 模式无效时会显示具体的错误原因。

    示例

    输入

    模式: (\w+)@(\w+)\.com
    测试文本: Contact alice@example.com or bob@test.com

    输出

    ✓ 2 个匹配
    #1 分组: $1=alice  $2=example
    #2 分组: $1=bob  $2=test

    圆括号创建捕获分组,替换操作中可用 $1、$2 引用。

    实用技巧

    • 校验邮箱输入?^[^\s@]+@[^\s@]+\.[^\s@]+$ 是个宽松版本,能挡住明显的输入错误,但完整符合 RFC 5322 标准得靠专门的库,不是一行正则能搞定的。
    • 从 URL 里提取查询参数:用 [?&]([^=]+)=([^&]*) 配合 g 标志,直接读每个匹配的 $1/$2,比手写按 & 和 = 拆分靠谱。
    • 打算把模式用进 .replace() 里?先在这里测——高亮的部分就是 .replace() 会替换的部分,捕获分组也一样准。
    • 解析多行日志(比如匹配每行开头的时间戳)时记得加 m 标志,这样 ^ 和 $ 才是按行锚定,而不是锚定整个字符串。
    • 从 Python 或 PHP 抄来的模式在这里不匹配?看看是不是用了 (?P<name>...) 命名分组——JavaScript 的写法是 (?<name>...),没有 P——或者占有量词(++、*+),这两个 JavaScript 正则都不支持。

    JavaScript 正则测试,不是通用测试

    本工具跑的是 JavaScript 内置的 RegExp 引擎——和你在浏览器控制台或 Node.js 脚本里写 str.match(pattern)、pattern.test(str) 用的是同一套代码。这和很多“通用”正则测试工具默认的 PCRE(PHP 常用)或 Python 的 re 模块不一样:JavaScript 没有占有量词、没有原子组,命名捕获分组的写法是 (?<name>...),不是 PCRE/Python 的 (?P<name>...)。

    如果你打算把正则用进 JS 或 TypeScript 代码——表单校验、路由匹配、日志解析——在这里测试就意味着零方言差异:页面上高亮的内容,就是运行时 new RegExp(pattern, flags) 会匹配到的内容,分毫不差。

    在实际工作流中的位置

    单独测正则的场景很少见。常见顺序是:先在这里确认模式没问题,再在代码里跑真正的 .replace(),最后对比替换前后的文本,确认改动符合预期、没有误伤。

    用捕获分组提取结构化数据,往往下一步就是拼进 JSON——把提取结果格式化一下,检查解析出来的形态对不对。

    文本对比 · JSON格式化

    常见问题

    这个工具用的是哪种正则方言?

    JavaScript(ECMAScript),即所有浏览器和 Node.js 内置的引擎。核心语法各语言通用,但个别特性有差异——比如 Python 和 Java 的后行断言支持和命名分组语法略有不同。

    为什么只匹配到第一个结果?

    缺少 g(全局)标志。没有 g 时正则找到第一个匹配就停止。本工具默认带 g——检查是否被删掉了。

    为什么 . 匹配不到换行?

    默认情况下 . 匹配除换行外的任意字符。加上 s 标志(dotall)让 . 也匹配换行,或者用 [\s\S] 这个通用写法。

    捕获分组结果是什么意思?

    模式中每对圆括号会捕获它匹配到的文本。$1 是第一组,$2 是第二组,以此类推——替换和提取代码中引用的就是它们。

    为什么我的正则很慢甚至卡死?

    很可能是灾难性回溯,由 (a+)+ 这类嵌套量词在不匹配的输入上引起。重写模式避免有歧义的重复。本工具最多显示 1000 个匹配以保持流畅。

    相关工具