跳至内容

免费在线正则表达式测试器和验证器 - 即时测试模式

正则表达式测试器可以在线检验用户输入的正则表达式语法是否正确,并实时高亮显示目标文本中与该模式相匹配的具体部分,同时明确标示出该模式是否与整段文本完全匹配,方便快速定位匹配失败的原因。该免费工具适合开发者调试字符串验证规则、从文本中提取信息或校验用户输入格式是否合法。

正则表达式模式测试器

匹配结果

输入模式和测试文本以查看结果

保存模式

已保存的模式

尚无已保存的模式

正则表达式符号指南

.匹配除换行符外的任何字符
\d匹配任何数字(0-9)
\D匹配任何非数字字符
\w匹配任何单词字符(a-z、A-Z、0-9、_)
\W匹配任何非单词字符
\s匹配任何空白字符
\S匹配任何非空白字符
^匹配行首
$匹配行尾
*匹配前面字符的0次或多次出现
+匹配前面字符的1次或多次出现
?匹配前面字符的0次或1次出现
{n}匹配前面字符恰好n次
{n,}匹配前面字符至少n次
{n,m}匹配前面字符n到m次
[abc]匹配括号中的任何一个字符
[^abc]匹配不在括号中的任何字符
(abc)将多个标记组合在一起并捕获匹配项
a|b匹配a或b
\b匹配单词边界位置
加载计算器...
📚

文档

什么是正则表达式测试器

正则表达式测试器是一种工具,用来把正则表达式与一段文本进行比对,并显示它匹配到了什么。正则表达式(简称 regex)是一小串字符,用来描述文本中的某种模式,例如“连续三个数字”或“以大写字母开头的任意单词”。这个正则表达式验证器让用户输入一个模式和一些测试文本,无需编写任何代码,就能立即看到高亮显示的匹配结果。

许多编程语言都使用正则表达式来搜索文本、检查用户输入的格式是否正确,以及从较大的文本块中提取特定片段。它的语法简洁,但很容易出错,因此在程序中使用某个模式之前先进行测试,有助于及早发现错误。

如何在线测试正则表达式

  1. **输入模式。**在模式输入框中输入正则表达式。用户输入时,工具会检查语法;如果模式无效,例如括号没有闭合,就会显示错误信息。
  2. **选择标志。**标志会改变模式的应用方式(见下文)。
  3. **输入测试文本。**在测试文本框中输入或粘贴要搜索的文本。
  4. **查看结果。**匹配项会在文本中高亮显示,工具还会报告找到的匹配数量。如果有测试文本,它还会说明该模式是匹配了从头到尾的整段文本,还是只匹配了其中一部分。
  5. **保存模式。**可以为模式添加一个简短的标签并保存,以便以后重复使用。保存的模式存放在浏览器中,而不是服务器上,所以只会出现在同一台设备的同一个浏览器里。
  6. **复制结果。**只需点击一下,就能把匹配到的文本或模式本身复制到剪贴板。

正则表达式标志

标志是添加在模式之后的单个字母,用来改变模式的行为。本工具提供标准 JavaScript 标志中的四个:

标志名称影响
g全局查找文本中的每一处匹配,而不是找到第一处就停止。
i不区分大小写忽略大写和小写的差异。
m多行使 ^ 和 $ 匹配每一行的开头和结尾,而不只是整个文本的开头和结尾。
s点号匹配所有字符使 . 也能匹配换行符。

标志通过下拉菜单选择。菜单列出每个单独的标志,以及若干包含 g 的预设组合,例如表示全局且不区分大小写的 gi,或同时表示全局、多行和点号匹配所有字符的 gms。

工具如何查找匹配项

匹配器总是在文本中搜索该模式的每一处出现,所以即使在下拉菜单中没有选中全局标志,匹配计数的表现也如同全局标志已开启。每个匹配项都会记录其位置和长度,然后原始文本被拆分为匹配和未匹配的片段,以便高亮显示匹配项。

要检查某个模式是否匹配整个文本,工具会把该模式包在一个非捕获组中并加上锚点:^(?:pattern)$。分组很重要,因为 |(交替)的结合优先级低于锚点。如果没有分组,像 cat|dog 这样的模式加上锚点后写成 ^cat|dog$,实际含义就成了“以 cat 开头,或以 dog 结尾”,这与“整个文本是 cat 或 dog”并不相同。该检查使用所选的标志,但不包括 g 和 m。不使用 m,可使 ^ 和 $ 始终对应整个文本的开头和结尾,因此,只适合多行文本中某一行的模式,不会被算作整段文本的匹配。

算例

模式:\d+(一个或多个数字),标志:g,测试文本:Room 12 has 5 chairs。

  • 找到的匹配项:12 和 5,所以匹配数量为 2。
  • 整段文本检查:该模式不匹配整个文本,因为文本中还包含字母和空格。

如果把测试文本改为 12345,同一个模式就会匹配整个字符串,因此整段文本检查的结果为 true。

正则表达式语法参考

字符匹配

符号含义示例匹配内容
.除换行符以外的任意字符a.c"abc", "adc", "a1c"
\d任意数字,0 到 9\d{3}"123", "456"
\D任何不是数字的字符\D+"abc", "xyz"
\w任意字母、数字或下划线\w+"abc123", "test_123"
\W任何不是字母、数字或下划线的字符\W+"!@#"
\s任意空白字符a\sb"a b"
\S任何不是空白的字符\S+"abc"

位置锚点

符号含义示例匹配内容
^行首^abc位于行首的 "abc"
$行尾abc$位于行尾的 "abc"
\b单词边界\bword\b作为完整单词的 "word"

量词

符号含义示例匹配内容
*前一项出现零次或多次a*b"b", "ab", "aab"
+前一项出现一次或多次a+b"ab", "aab"
?前一项出现零次或一次colou?r"color", "colour"
{n}前一项恰好出现 n 次a{3}"aaa"
{n,}前一项至少出现 n 次a{2,}"aa", "aaa"
{n,m}前一项出现 n 到 m 次a{2,4}"aa", "aaa", "aaaa"

字符集和分组

符号含义示例匹配内容
[abc]方括号中列出的任意一个字符[aeiou]任意一个元音字母
[^abc]方括号中未列出的任意字符[^aeiou]任意非元音字符
(abc)把字符分组并捕获匹配内容(abc)+"abc", "abcabc"
a\b匹配 a 或 bcat\

还有两个功能值得了解。先行断言写作 a(?=b),它只在 "a" 后面紧跟 "b" 时才匹配 "a",且匹配结果不包含 "b"。后行断言写作 (?<=a)b,它只在 "b" 紧跟在 "a" 之后时才匹配 "b"。

常见模式示例

这些模式可以粘贴到工具中,查看它们对示例文本的匹配效果。

仅限数字:^\d+$ 匹配完全由数字组成的字符串,例如“48210”,并拒绝任何包含字母或空格的内容。

电子邮件地址(基本检查):^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ 匹配形如 name@domain.tld 的地址,例如 "user@example.com"。这只是一个简单的检查,并不是互联网标准所定义的完整电子邮件格式,所以一些少见但有效的地址会通不过检查。

美国电话号码:^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$ 匹配如“(123) 456-7890”“123-456-7890”和“1234567890”这样的格式。

YYYY-MM-DD 格式的日期:^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$ 检查月份在 01 到 12 之间,日期在 01 到 31 之间。它不会检查该日期对具体月份是否有效,所以会接受“2024-02-30”,尽管二月从来没有 30 天。

常见问题

什么是正则表达式? 正则表达式是定义搜索模式的一串字符。大多数编程语言和文本编辑器都用它来搜索、匹配和编辑文本。

全局标志有什么作用? 没有全局标志时,搜索通常在第一处匹配之后就停止。使用全局标志(g)时,搜索会继续进行,并报告文本中的每一处匹配。无论选择哪个标志,本工具在统计匹配数量时总是搜索所有匹配项。

如何匹配字面意义上的点号或其他特殊字符? 在它前面加一个反斜杠。例如,\. 匹配字面意义上的点号,而不是“任意字符”,后者正是未转义的 . 的含义。

.* 和 .*? 有什么区别? .* 是贪婪匹配,会匹配尽可能多的字符。.*? 是惰性匹配,在让模式其余部分仍能匹配成功的前提下,匹配尽可能少的字符。

如何检查整个字符串是否匹配某个模式,而不只是其中一部分? 在模式开头加上 ^,在结尾加上 $,例如用 ^[0-9]+$ 匹配只含数字的字符串。

本测试器的匹配规则与其他编程语言的正则表达式规则一致吗? 本工具使用 JavaScript 内置的正则表达式引擎。字符类和量词等大部分核心语法在 Python、Java 和 Perl 等语言中是通用的,但一些细节有所不同,所以在这里有效的模式并不保证在所有地方的表现都完全一致。

参考文献

  1. MDN Web Docs。Regular expressions。正则表达式指南——JavaScript 标志 g、i、m(^ 和 $ 匹配每一行)和 s(. 匹配换行符)。
  2. MDN Web Docs。Assertions。正则表达式断言——先行断言仅在 x 后面紧跟 y 时匹配 x;后行断言仅在 x 前面是 y 时匹配 x。
  3. MDN Web Docs。Quantifiers。正则表达式量词——量词默认是贪婪的;末尾加 ? 可使其变为非贪婪。
  4. Resnick, P.(编)。RFC 5322: Internet Message Format。RFC Editor,2008。RFC 5322——标准的地址语法,其本地部分允许使用 ! # ' 和 * 等字符,而基本模式会拒绝这些字符。