正则表达式在线测试

输入正则与文本实时高亮匹配结果,查看捕获组与位置,内置常用模板,支持替换预览与标志位切换。

写一个匹配手机号或日志时间戳的正则,光靠脑补很难确认对不对:边界情况、贪婪匹配、转义有没有多写一层,都得拿真实文本试一遍才知道。更麻烦的是不同语言的方言有差异,JavaScript 里能跑的写法换到 PCRE 未必成立。

本工具用 JavaScript 原生的 RegExp 在浏览器里执行匹配,输入即算,不会把正则和测试文本发往服务器——拿生产日志来验证时这一点很关键。除了高亮,页面还会列出每个匹配的起始位置与捕获组内容,配合替换预览可以直接看到替换结果长什么样。

贪婪匹配与懒惰匹配的区别

量词默认是贪婪的:.* 会尽可能往后吃,直到无法满足后面的条件才回溯;给量词加上 ? 变成懒惰模式,.*? 会在第一个能满足整体匹配的位置停下。例如在 <a><b> 上匹配 <.*> 得到整串,用 <.*?> 只得到 <a>。惰性并非万能,像 [^>]* 这种排除型字符组在性能和可读性上往往更好,也更不容易触发回溯。

回溯灾难为什么会卡死浏览器

形如 (a+)+b 的嵌套量词,在匹配失败时会尝试指数级的字符划分组合:输入二十几个 a 就能让 JavaScript 引擎进入数百万次回溯,页面直接无响应,这就是 ReDoS。规避方式是避免嵌套量词、用更精确的字符组代替 .*、对输入先做长度限制,或者把高风险正则放到服务端并设置超时。任何在线正则工具都逃不过这个问题,因为限制来自正则引擎本身。

常用标志位与中文匹配

g 决定是否查找全部匹配,不加只能拿到第一个;i 忽略大小写;m 让 ^ 和 $ 匹配每一行的首尾而不是整段文本的首尾;s 让点号也能匹配换行符;u 启用 Unicode 模式,让码点处理正确并支持 \p{Script=Han} 这类属性。匹配中文时推荐用 u 标志配合 \p{Script=Han},比手写 [\u4e00-\u9fa5] 覆盖更完整,也能正确处理生僻字与扩展区汉字。

广告

常见问题

为什么我的正则会让浏览器卡死?
多半是嵌套量词造成的回溯灾难,例如 (a+)+、(.*)* 这类写法在匹配失败时会尝试指数级组合。缩短测试文本只能暂时缓解,根治办法是重写正则,用排除型字符组或限定长度替代嵌套量词。
正则里的 g 标志有什么作用?
g 表示全局匹配,加上之后才能找到所有匹配项,不加只返回第一个。使用 g 时如果复用同一个正则对象反复调用 test/exec,lastIndex 会在调用之间累积,导致结果时有时无,需要手动重置;替换和统计一般都要开 g。
怎么用正则匹配中文?
简单场景可以用 [\u4e00-\u9fa5],但它不包含扩展区汉字;更严谨的做法是加上 u 标志后写 \p{Script=Han},可匹配绝大部分汉字。如果只想匹配姓名常用的两到四个汉字,还要再配合量词与边界条件。
正则替换里的 $1、$2 是什么?
它们引用第 1、第 2 个捕获组匹配到的内容。使用前要确保正则里确实写了对应的括号分组,替换串写成 $2-$1 就是把两组内容交换位置;分组编号按左括号出现的顺序,非捕获组 (?:...) 不参与编号。

相关工具

广告