使用方法
- 输入模式,不要带斜杠。示例可找出写成2026-11-10形式的日期。
- 勾选所需的标志。g 查找所有匹配,i 忽略大小写,m 和 s 改变换行的读取方式。
- 粘贴测试文本。匹配会立即高亮显示,文本下方的列表给出每个匹配的位置和分组。
- 在“替换为”中输入文字即可看到替换结果,然后按“复制”取用。
此处的匹配方式
页面使用浏览器内置的正则表达式引擎,即 JavaScript 所用的引擎。匹配按顺序从文本开头开始查找。所示位置是匹配前的字符数,从0开始计,并按 JavaScript 处理文本的方式以 UTF-16 单位计数。
搜索在浏览器的后台工作线程中运行,因此页面保持响应。搜索在找到10,000个匹配后停止,超过200,000个字符的文本不会被搜索。对于可能匹配空字符串的模式,例如 x*,每次空匹配之后都会前进一个字符,因此搜索总会结束。运行超过2秒的搜索会被停止;请参阅关于灾难性回溯的部分。
- 不使用 g 标志时,只显示第一个匹配,与 String.match() 的做法相同。
- u 标志把表情符号或基本平面之外的其他字符读作一个字符。
- d 标志会在列表中加入每个分组的起止位置。
灾难性回溯与2秒限制
正则表达式引擎会依次尝试模式可能匹配的各种方式。对某些模式(主要是一个重复组内再套一个重复组,例如 (a+)+)而言,可能的方式数量增长极快:每多一个字符,工作量就可能翻倍。当文本几乎匹配、只在最末尾才失败时,这种情况最容易发生。
例如,模式 (a+)+$ 用于一段由许多字母 a 后接一个感叹号组成的文本时,无法匹配,因为 $ 需要文本的末尾。引擎在放弃之前,仍会尝试字母的每一种切分方式。字母约为26个时,典型计算机上的搜索就可能需要一秒或更久,每多一个字母都会慢得多。所需时间取决于您的设备。
本页面在后台工作线程中运行每次搜索,并在2秒后停止,同时显示提示信息。页面的其余部分仍可使用,因此您可以更改模式或文本后重试。
- 不要让一个重复嵌套在针对相同字符的另一个重复之中:应写 (a+)$,而不是 (a+)+$。对同一文本,安全的模式会立即完成。
- 写得具体一些:在分组中使用 [a-z] 或 \d+,而不要使用点号,这样匹配的各部分就不会以多种方式相互重叠。
- 先在文本的一小段样本上测试模式,然后再用于全文。
- 尽可能加上锚点:开头的 ^ 和结尾的 $ 可以避免引擎尝试每一个起始位置。
替换模式
替换文本遵循 JavaScript 中 String.replace() 的规则。美元符号开始一个代码,该代码会被替换为匹配的文本:
| 写法 | 替换为 |
|---|---|
| $1、$2等 | 编号分组的文本 |
| $& | 整个匹配 |
| $` | 匹配之前的文本 |
| $' | 匹配之后的文本 |
| $$ | 一个美元符号 |
| 美元符号、小于号、分组名和大于号 | 命名分组的文本 |
与 PCRE 和 .NET 的差异
为 PCRE(PHP、许多 Linux 工具)或 .NET(C#、Visual Basic)编写的模式,在此通常也能运行,但有些功能只存在于其中一种引擎。下表列出最重要的几项。
| 功能 | JavaScript(本页面) | PCRE 与 .NET |
|---|---|---|
| 原子组与占有量词 | 不支持 | PCRE 与 .NET 支持原子组;PCRE 支持 a++ 之类的占有量词 |
| 锚点 \A、\Z 和 \z | 不支持:请改用 ^ 和 $ | 支持 |
| 以 (?P<…>) 书写的命名分组 | 不支持 | PCRE 支持 |
| 模式内的内联选项,例如 (?i) | 不支持:请改为设置标志 | .NET 支持 |
| 用 \K 排除匹配中的文本 | 不支持 | PCRE 支持 |
| 替换命名分组 | 美元符号、小于号、名称、大于号 | .NET 使用美元符号、花括号、名称、花括号 |
计算示例:一段文本中的三个日期
示例模式有三个命名分组:四位数字的年份,两位的月份和两位的日期,之间用连字符分隔。文本中含有三个日期,它们分别在位置14、34和50处匹配,位置从第一个字母处的0开始计算。
替换文本为日、月、年三个分组名(即美元符号加上各自被小于号和大于号括起来的名称),三个日期会被改写为10.11.2026、03.12.2026和15.01.2027。替换结果为:Invoice dated 10.11.2026, paid on 03.12.2026. Due 15.01.2027.
常见问题
这个测试工具使用哪种正则表达式语法?
它使用浏览器内置的 JavaScript 引擎。用于搜索、校验和清理文本的大多数模式,在 JavaScript、PCRE 和 .NET 中的写法相同,但有少数功能不同,如差异一节所列。
为什么列表在10,000个匹配处停止?
匹配按顺序收集。列表过长会绘制缓慢,也难以阅读,因此当模式匹配得更多时,页面只显示前10,000个匹配,并说明搜索已经停止。
为什么超过200,000个字符的文本会被拒绝?
文本过长会使页面变慢,而模式在其上运行可能要花很长时间。请先在文本的一部分上测试模式,再用于其余部分,或把文本切成较小的段落。
为什么高亮会略过某些匹配?
不包含任何字符的匹配,例如 x* 在字母之间找到的空位置,没有可高亮的内容。它仍会保留在列表中并标明位置,因此您依然可以看到它在哪里。
测试工具会把我的文本发送到服务器吗?
不会。匹配在您的浏览器中进行,页面不会保存您输入的内容,也不会将其发送到任何地方。关闭页面即会清除。
无效模式的提示是什么意思?
该模式无法被读取为 JavaScript 正则表达式。提示来自引擎,原文为英文,它会指出问题所在,例如某个括号从未闭合。
能否在这里测试为 PCRE 或 .NET 编写的模式?
通常可以,前提是它只用了常见功能。若其中含有原子组、占有量词、\A 或 \z,或内联选项,请先把那部分改写为 JavaScript 写法;表格列出了这些功能。
为什么页面提示模式运行时间过长?
搜索在此文本上没有在2秒内完成,因此页面将其停止。这通常意味着模式中有一个重复嵌套在另一个重复之中,例如 (a+)+,而文本又几乎匹配。灾难性回溯一节给出了更安全的写法。
资料来源
- MDN:JavaScript 正则表达式,包括标志与分组(英文)
- MDN:String.prototype.replace(),替换模式(英文)
- PCRE2 模式语法(PCRE 文档,英文)
- Microsoft:.NET 正则表达式语言速查(英文)
数据和文字最近核对于2026年11月10日星期二。