正则表达式在线测试工具

加载中…

反馈问题操作上面写正则、点标志开关,左边贴测试文本,匹配到的部分在右边高亮;可从「常用正则」一键填入

猜你喜欢

正则表达式在线测试工具:写好正则、贴上测试文本,匹配到的部分马上高亮,清单里列出每个匹配的位置(第几行第几列)、编号分组和命名分组;支持 g、i、m、s、u 五个标志和替换模式($1、$<名字>),语法写错时把浏览器的原话和一句中文说明一起给出。内置手机号、邮箱、身份证号格式、网址、IPv4、日期、汉字、邮编、密码强度、HTML 标签等 20 多条常用正则,每条写清能匹配什么、不能保证什么,另有一张正则表达式语法速查表。全部在本机浏览器里运行,不上传。

怎么用

这是一个正则表达式在线测试工具:写正则、贴文本,匹配结果实时看,不用下载安装,也不用注册。页面顶部常驻一句说明:正则表达式在线测试的全部工作都在你这台设备的浏览器里完成,不上传、不联网,输入的内容也不保存,刷新就回到初始状态。

一、三步开始

  1. 写正则:在最上面那一行输入正则,只写两条斜杠中间的那一段,不用连斜杠一起写。比如想找数字,就写 \d+。
  2. 开标志:下面五个开关是标志,决定匹配的方式,见后面「五个标志」。最常开的是 g(找全部)。
  3. 贴文本:在左边的「测试文本」里贴上要测试的文字,匹配到的部分会在右边高亮,下面的清单列出每一处。

停手约 0.2 秒后自动重算,不用点按钮。刚打开时页面里有一个小例子(找数字),可以先改着玩。

二、五个标志

  • g(全局):找出所有匹配。不开的话只找第一个,这是「怎么只高亮了一处」的最常见原因。
  • i(忽略大小写):A 和 a 当成同一个字母。
  • m(多行):让 ^ 和 $ 匹配每一行的行首行尾,而不只是整段文字的开头结尾。
  • s(点号含换行):让 . 也能匹配换行符。
  • u(Unicode):按 Unicode 码点处理,才能使用 \p{L}(任何语言的字母)、\p{Han}(汉字)这类写法;加上它以后对转义的要求也更严格。

三、工具条

  • 常用正则:下拉里有 20 多条现成的(手机号、邮箱、身份证号格式、网址、IPv4、日期、汉字、邮编、密码强度、HTML 标签等),选一条就会把正则、标志和一段样例文本一起填好;下面会写清「能匹配什么」「不能保证什么」,请先读这两句再用。
  • 复制正则:把 /正则/标志 整条复制走,可以直接粘进代码里。
  • 替换模式:打开后多出一个替换区,填上要换成的内容,下面实时出替换结果,可以复制。
  • 速查表:展开元字符、量词、分组、断言、替换串、标志的对照表。
  • 清空:把正则、文本、替换串都清掉重来。

写文档要排版,可以用 Markdown 在线编辑器,语法记不全时看 Markdown 语法速查,每条写法旁边就是效果。

怎么看结果

状态行与高亮

状态行告诉你一共匹配了几处。右边的高亮用两种颜色(黄、蓝)交替,相邻的两个匹配不会糊成一片。匹配到的内容是空串(长度为 0,比如 x* 在没有 x 的地方)时画不出来,清单里仍然会列出它的位置。

匹配清单

清单每一行是一个匹配:

  • 位置:第几行第几列(从 1 数起),括号里是从 0 数起的字符下标,起点到终点(不含终点)。
  • 匹配内容:空格显示成 ·,制表符显示成 →,换行显示成 ↵,免得看不出来。
  • 分组:括号捕获到的内容,$1、$2 按左括号的顺序编号;命名分组 (?<名字>…) 直接显示名字。分组没参与匹配时(比如 (a)|(b) 里没走到的那一支)显示「没参与」。

没匹配上怎么办

按这个顺序检查:

现象 常见原因 怎么办
只高亮了第一处 没开 g 标志 打开 g
大小写不同就匹配不上 没开 i 标志 打开 i
^、$ 只管整段,不管每行 文本是多行的,没开 m 打开 m
. 匹配不了换行 点号默认不含换行 打开 s,或改用 [\s\S]
小数点、括号匹配不到 元字符没转义 写成 \.、\(、\)
匹配多了、吃到了不该吃的 贪婪量词尽可能多吃 改成惰性 *?、+?,或把 . 换成更具体的 [^"]
整个页面没反应或很慢 灾难性回溯 看本页常见问答里的避免办法

语法写错了

正则写错时,页面会给出一张红色的报错卡:先是一句中文说明(比如「括号没有配对」「量词前面没有可以重复的内容」),下面原样附上浏览器给出的英文报错,方便你拿去搜索或贴给别人。不同浏览器的报错措辞略有不同,这是正常的。

复制到豆包

写好正则以后,结果下面会出现「复制到豆包」一键:它把你的正则、标志、测试文本前 500 字和当前的匹配情况(或报错)复制走,再加一句请求,请 AI 逐段解释正则、找出没匹配上的原因、给出改好的写法和测试用例。点一下才会复制,不会自动发送。

常见问题

常用正则能直接拿去用吗?

可以当起点,但别当成标准答案。库里每一条都写了「能匹配什么」和「不能保证什么」:

  • 手机号:只写「1 开头的 11 位数字」。具体号段由运营商分配并会变化,号段以运营商公布为准,所以本页不把号段写死;要更严格的话,可以按最新的公布范围自己收窄第二位。
  • 身份证号:只校验 18 位的格式和末位校验码的算法,不能验证真假。2 月 30 日这类不存在的日期也拦不住。
  • 邮箱:只看常见写法,不能保证这个邮箱真实存在、能收信。
  • 密码强度:满足大小写加数字的格式不等于安全,Password1 这类常见组合照样容易被猜到。
  • HTML 标签:粗略地找标签可以,真要解析网页请用 HTML 解析器。

同一个正则放到别的语言里结果不一样?

可能。本页跑的是 JavaScript 的正则引擎,Python、Java、PHP、Go 的核心写法相通,细节有差别:命名分组的语法、标志的写法、Unicode 处理、后行断言能不能写变长内容。换语言前,用那门语言再测一遍。

贪婪和惰性有什么区别?

*、+、{n,m} 默认是贪婪的,会尽可能多地匹配;后面加一个 ? 变成惰性,尽可能少地匹配。拿 <.+> 去匹配 <a><b>,贪婪会一口吃下整串 <a><b>,换成 <.+?> 才会分别匹配 <a> 和 <b>。

灾难性回溯到底怎么防?

测试文本最多只跑前 2 万字;检测到「括号里带 + 或 *、括号外又接 + 或 *」这种典型写法时,只测前 24 个字符。这是粗略的防护。更可靠的是写法上避免:不嵌套量词、重复的部分互斥、能写具体字符就不写 .。详细办法见本页的常见问答。

原理与冷知识

正则引擎怎么工作

JavaScript 的正则引擎是「回溯式」的:从文本的第一个位置开始,按正则一步步尝试,走不通就退回上一个分叉点换条路。这种做法写起来灵活(支持反向引用、断言),代价是遇到最坏情况会指数级变慢,也就是上面说的灾难性回溯。另一类引擎(自动机式,Go 和 Rust 的标准正则就是)保证线性时间,但不支持反向引用这类写法。

断言:只看,不吃

(?=…) 先行断言、(?!…) 否定先行断言、(?<=…) 后行断言、(?<!…) 否定后行断言,都只检查「这个位置的前面或后面是不是某种样子」,不消耗字符,也不会出现在匹配结果里。密码强度那一条就是用先行断言,分别检查「有小写字母」「有大写字母」「有数字」,三个条件各管各的。较旧的浏览器不支持后行断言,写了不生效时升级浏览器或换写法。

空匹配

有的正则可以匹配到长度为 0 的东西,比如 x* 在没有 x 的地方也算匹配成功。本页遇到空匹配会让位置往前走一格再继续,不会原地打转,清单里能看到这些空匹配的位置,但高亮画不出来。

校验码是怎么算的

18 位身份证号的最后一位是校验码:把前 17 位依次乘以固定的权重(7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2),求和后除以 11 取余数,再按余数从 1 0 X 9 8 7 6 5 4 3 2 里取对应的一位。选中身份证那条常用正则后,匹配清单里会按这个算法核一遍,对得上只说明算法通过,不代表是真实证件。

更多问答

正则表达式是什么?正则表达式有什么用?

正则表达式(常简称正则)是一种用符号描述「一类文字长什么样」的写法。比如 \d{3}-\d{4} 表示「三个数字、一个横杠、四个数字」。它最常见的用途有四种:检查输入是否符合格式(手机号、邮箱、日期)、从一大段文字里把需要的部分找出来、把一批文字按规则批量替换、把一段文字按规则拆开。几乎所有编程语言和很多编辑器(VS Code、Notepad++、Sublime)的查找替换里都有它,写法大同小异,细节各家略有差别。

这个正则表达式在线测试用的是什么引擎?写法和别的语言通用吗?

用的是你这个浏览器自带的 JavaScript 正则引擎,也就是 JS 里 new RegExp 用的那一个。核心写法(字符类、量词、分组、断言、反向引用)在 Python、Java、PHP、Go 里基本相通;有差别的地方主要是:命名分组的写法(JS 是 (?<名字>…),Python 是 (?P<名字>…))、标志的写法、对 Unicode 的处理、以及后行断言是否支持变长。拿到别的语言里用之前,建议用那门语言再测一遍。

什么是灾难性回溯?为什么我的正则会让页面卡住?

正则引擎遇到「这条路走不通」时,会退回去换一种分法再试,这叫回溯。大多数写法回溯几次就结束了,但像 (a+)+$ 这种「括号里有 + 、括号外又套一层 +」的写法,遇到一长串 a 后面跟个 b 的文本,可能的分法会成倍增长(每多一个字符,时间翻一倍),几十个字符就能算上几分钟,这就是灾难性回溯。浏览器里的 JavaScript 没法中途打断一条正在算的正则,所以真遇上了页面会卡住。本页做了两层防护:测试文本最多只跑前 2 万字;检测到这种嵌套量词的典型写法时,只测前 24 个字符。但这只是粗略的识别,不是所有会回溯的写法都能认出来,写完正则最好用「最坏的输入」(一长串能匹配的字符,末尾故意放一个不匹配的)自己试一下。

怎么写才能避免灾难性回溯?

几条通行的办法:一、不要在一个被 + 或 * 重复的括号里再放 + 或 *,比如把 (a+)+ 直接写成 a+;二、重复的部分尽量互斥,不要让相邻两段都能吃同一种字符,比如 \d+\d* 不如 \d+;三、能写具体字符就不写 . ,比如匹配引号里的内容写 "[^"]*" 而不是 ".*" ;四、选项分支(a|b)里的几个分支不要互相包含;五、对不可信的输入(用户提交的文本)别用来历不明的正则,并给输入长度设上限。

为什么我的正则没匹配上?总是只匹配到第一个?

最常见的几个原因:一、没开 g 标志,只会找第一个匹配,所以只高亮一处;二、没开 i 标志,大小写不同就匹配不上;三、用了 ^ 和 $ 但文本是多行的,没开 m 标志时它们只管整段文字的头和尾,不管每一行;四、用了点号 . 想匹配换行,但点号默认不含换行,需要开 s 标志;五、元字符没转义,比如想匹配小数点要写 \. ,想匹配括号要写 \( ;六、正则输入框里连两边的斜杠一起写了,本页只要写中间那一段。匹配不上时看看状态行和报错卡,通常能直接定位。

手机号正则、身份证正则能保证号码是真的吗?

不能。正则只检查「长得像不像」,不能证明号码真实存在。手机号这条本页只写「1 开头的 11 位数字」,因为具体号段由运营商分配并会变化,哪些号段已开放以运营商公布为准;身份证这条只校验 18 位的格式(地区码首位、出生日期的年月日范围、末位是数字或 X),不查地区码是否真实存在,也不能验证这个人是否存在。选中身份证那条后,清单里会顺手按校验码算法核一遍第 18 位,也只说明算法对得上。需要确认真假的场景,要走官方的核验渠道。

测试文本很长怎么办?匹配太多会怎样?

测试文本超过 2 万字时,本页只对前 2 万字跑匹配,并在状态行写明;匹配超过 1000 处时,只列出前 1000 处。这样做是为了保证页面不被超长文本拖慢。输入时有 0.2 秒的停顿缓冲,不会每敲一个字符就整段重算一次。如果要处理更大的文本,建议在自己的编辑器或程序里跑。

我写的正则和文本会被上传吗?

不会。匹配、替换全部在你这台设备的浏览器里完成,页面不发任何网络请求,断网以后照样能用;你输入的正则和文本也不保存,刷新页面就回到初始状态。「复制到豆包」那一键只在你点击时,把你本页的正则和测试文本前 500 字复制到剪贴板,不会自动发送给任何人。

正则里的 $1、$<名字> 是什么?替换怎么用?

括号会把匹配到的一部分记下来,叫分组,按左括号出现的顺序编号为 1、2、3。替换模式里的 $1 就是取第 1 个分组的内容,$<名字> 取命名分组的内容,$& 取整个匹配,$$ 表示一个字面的美元符号。举例:正则 (\d{4})-(\d{2})-(\d{2}),替换成 $3/$2/$1,就能把 2026-10-17 换成 17/10/2026。点工具条上的「替换模式」打开替换区;常用正则里的「拆分日期并调换顺序」就是一个现成的例子。

本页更新于 2026-10-17 · 分类:在线工具