跳到主要内容
LeedyBox
支持我们

正则表达式测试、替换与速查表

高亮显示正则表达式的匹配和捕获组,预览替换结果,并以六种语言的代码形式复制模式。

标志
匹配: 0

匹配详情与捕获组

速查表

点击某个模式即可连同示例文本一起加载。

语法参考

字符

.除换行外的任意字符(使用 s 标志时包括换行)
\d \D数字 0–9 / 非数字
\w \W单词字符(A–Z、a–z、0–9、_)/ 非单词字符
\s \S空白字符 / 非空白字符
[abc] [^abc]a、b、c 中的一个 / 除 a、b、c 以外的字符
[a-z]a 到 z 范围内的字符
\p{L}任何语言的字母(需要 u 标志)
\. \\ \(转义特殊字符以按字面匹配

量词

* + ?0 次或多次 / 1 次或多次 / 0 或 1 次
{n} {n,} {n,m}恰好 n 次 / 至少 n 次 / n 到 m 次
*? +? {n,m}?惰性:尽可能少地匹配

锚点

^ $文本的开头 / 结尾(使用 m 标志时为每行)
\b \B单词边界 / 非单词边界

分组与环视

(…)捕获组,用 $1、$2 … 引用
(?:…)非捕获组
(?<name>…)命名组,用 $<name> 引用
\1 \k<name>反向引用:与组匹配内容相同的文本
a|ba 或 b
(?=…) (?!…)后面紧跟 / 后面不跟
(?<=…) (?<!…)前面是 / 前面不是

替换

$1 $<name>编号组或命名组的文本
$& $$整个匹配 / 字面量 $

使用前请检查结果。 本工具按“原样”提供,不附带任何保证,结果可能不完整或有误。 服务条款

模式使用 JavaScript 正则引擎测试。在其他语言和数据库中,语法和行为可能不同。速查表中的模式是实用示例,并非完整的验证规则。

使用方法

  1. 在“正则表达式”中输入模式(不带两侧的斜杠和标志),并将文本粘贴到“测试文本”中。匹配结果会随输入在“匹配”中高亮显示并计数。如果想从示例开始,请点击“速查表”中的某个模式;这会替换当前的模式、标志、测试文本和替换设置。
  2. 在“标志”中勾选所需的标志;将鼠标悬停在字母上可查看其作用。页面打开时,g 和 u 处于开启状态。不使用 g 时,只会找到第一个匹配,也只会替换第一个匹配。
  3. 查看“匹配详情与捕获组”:每个匹配都会列出其位置,以及以 $1、$2 等表示的各组文本,命名组还会显示组名。开启 d 标志后,还可以看到每个组的起止位置。
  4. 要尝试替换,请勾选“将匹配替换为”并输入替换内容,用 $1 或 $<name> 引用组。替换后的文本显示在“替换结果”中,点击“复制结果”即可复制。
  5. 在“代码生成器”中选择 JavaScript、Python、Java、PHP、Go 或 C#,然后点击“复制代码”。勾选“将匹配替换为”时,代码片段中会包含替换操作。“复制为 /模式/标志”会将模式复制为 JavaScript 正则字面量。

常见问题

我测试的文本会被发送到其他地方吗?

不会。模式和测试文本由浏览器自带的 JavaScript 正则引擎在您的浏览器中进行匹配,不会上传到 LeedyBox,本工具也不会保存它们。

为什么我的模式匹配到的文本比预期的多?

模式在任何符合的位置都会匹配,因此 \d{3} 也会在 12345 中找到 123。要匹配完整的单词或数字,请在两端加上 \b;或者像速查表中的密码模式那样,使用 ^ 和 $ 要求整段文本匹配(开启 m 时为每一行)。\b 依据的是 \w 的单词字符(A–Z、a–z、0–9 和 _),会把 é 或 한 这样的字母视为非单词字符,因此当 café 后面跟着空格时,\bcafé\b 无法匹配它。+ 和 * 等量词也是贪婪的:对于 <b>x</b>,模式 <.+> 会匹配整个字符串,而 <.+?> 或 <[^>]+> 会在第一个 > 处停止。

为什么在 Python、PHP 或 Java 中可用的模式,在这里显示“正则表达式错误”?

本页面使用 JavaScript 引擎,它不接受其他引擎的某些语法,例如 (?P<name>…) 命名组、开头的 (?i) 等内联标志、原子组 (?>…) 以及 a++ 这样的占有量词。请将命名组写成 (?<name>…),并用“标志”中的复选框代替内联标志。使用 u 标志时,JavaScript 对转义的要求也更严格:\# 会报错,方括号外的 \- 也会报错,因此请删除反斜杠或关闭 u。

为什么 \p{L} 匹配不到字母,或者一个表情符号被算作两个字符?

\p{L} 这样的 Unicode 属性类需要 u 标志;没有 u 时,JavaScript 会把 \p{L} 当作字面文本 p{L},而 . 只能匹配基本多文种平面(BMP)之外字符(例如许多表情符号)的一半。加载速查表中的模式时也会加载其标志,而除“特殊字符”外,其他模式都不开启 u,因此在添加这类语法之前,请先检查“标志”。即使开启 u,. 也只匹配一个码位,而有些表情符号(例如旗帜或带肤色的点赞手势)由两个或更多码位组成。匹配详情中的位置与 JavaScript 一样按 UTF-16 代码单元计算,因此即使开启 u,基本多文种平面之外的字符也会占两个位置。

为什么替换内容中的 \n 不会插入换行?

替换内容遵循 JavaScript replace() 的规则:只有以 $ 开头的序列才有特殊含义,因此 \n 和 \t 会作为反斜杠加字母插入,而不是换行或制表符。该输入框只能输入一行,因此无法在这里输入换行,请在生成的代码中添加。要删除匹配内容,请勾选“将匹配替换为”并将输入框留空,就像速查表中的“删除 HTML/XML 标签”模式那样。

如果模式运行得非常慢,或者匹配数量非常多,会怎样?

如果浏览器允许使用 Web Worker,匹配会在后台 Worker 中运行,并在 2 秒后停止;因此,存在灾难性回溯的模式(例如对一长串 a 后接另一个字符的文本使用 (a+)+$)会显示提示,而不会让页面卡死。“匹配”中的计数包括所有匹配,但只有前 1,000 个会被高亮显示并列在详情中。

生成的代码可以直接粘贴到我的项目中吗?

请把它作为起点。生成器在 JavaScript 中将模式写成正则表达式字面量,在其他语言中则写成字符串;在语法不同的地方改写命名组和替换引用(例如 Python 中的 (?P<name>…) 和 \g<1>),转换 i、m 和 s 标志,并假定您的输入存放在名为 text 的变量中。如果模式中包含引号或斜杠,请检查代码片段是否正确地转义了它们。各引擎之间仍有差异:Go 的 regexp 包使用 RE2 语法,不支持环视和反向引用;Python 标准库中的 re 模块不支持 \p{…} 类,因此请用您自己的数据测试代码。