免费在线正则表达式测试器和验证器 - 即时测试模式
正则表达式测试器可以在线检验用户输入的正则表达式语法是否正确,并实时高亮显示目标文本中与该模式相匹配的具体部分,同时明确标示出该模式是否与整段文本完全匹配,方便快速定位匹配失败的原因。该免费工具适合开发者调试字符串验证规则、从文本中提取信息或校验用户输入格式是否合法。
正则表达式模式测试器
匹配结果
输入模式和测试文本以查看结果
保存模式
匹配结果
输入模式和测试文本以查看结果
已保存的模式
尚无已保存的模式
正则表达式符号指南
.匹配除换行符外的任何字符\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)是一串简短的字符,用于描述文本中的模式,例如“连续的三个数字”或“以大写字母开头的任意单词”。这个正则表达式验证器允许用户输入模式和测试文本,然后立即查看高亮显示的匹配结果,无需编写代码。
许多编程语言都使用正则表达式搜索文本、检查用户输入是否符合规定格式,以及从较大的文本块中提取特定内容。正则表达式的语法简洁,但容易写错,因此在程序中使用模式前进行测试,有助于尽早发现错误。
如何在线测试正则表达式
- 输入模式。 在模式字段中输入正则表达式。工具会在输入过程中检查语法;如果模式无效,例如括号未闭合,就会显示错误消息。
- 选择标志。 标志会改变模式的应用方式(见下文)。
- 输入测试文本。 在测试文本框中输入或粘贴要搜索的文本。
- 查看结果。 匹配内容会在文本中高亮显示,工具还会报告找到的匹配数量。如果存在测试文本,工具也会说明模式是从文本开头到结尾匹配完整文本,还是只匹配其中一部分。
- 保存模式。 可以为模式添加简短标签并保存,以便稍后重复使用。保存的模式保存在浏览器中,而不是服务器上,因此只会在同一台设备和同一个浏览器中显示。
- 复制结果。 匹配到的文本或模式本身都可以通过一次点击复制到剪贴板。
正则表达式标志
标志是添加在模式后面的单个字母,用于改变模式的行为。此工具支持以下四个标志,也可以组合使用:
| 标志 | 名称 | 作用 |
|---|---|---|
g | 全局匹配 | 查找文本中的所有匹配,而不是找到第一个匹配后停止。 |
i | 不区分大小写 | 忽略大写和小写之间的差异。 |
m | 多行模式 | 使 ^ 和 $ 匹配每一行的开头和结尾,而不只是整个文本的开头和结尾。它会改变匹配位置,但不会改变下文所述的完整文本检查。 |
s | 点号匹配全部 | 使 . 也能匹配换行符。 |
标志可以组合使用,例如 gi 表示全局且不区分大小写,gms 表示同时启用全局、多行和点号匹配全部。
工具如何查找匹配内容
匹配器始终会搜索文本中模式出现的每一个位置。因此,即使下拉菜单中没有选择全局标志,匹配计数的行为也相当于已启用全局标志。每个匹配都会记录其位置和长度,然后将原始文本拆分为匹配部分和非匹配部分,以便高亮显示匹配内容。
若要检查模式是否匹配完整文本,工具会将模式放入非捕获组中并添加定位符:^(?:pattern)$。分组很重要,因为 |(交替)运算符的绑定范围比定位符更宽松。如果不使用分组,将类似 cat|dog 的模式锚定为 ^cat|dog$,其实际含义是“以 cat 开头,或以 dog 结尾”,而不是“整个文本是 cat 或 dog”。
这项检查还会去除多行标志。启用 m 后,^ 和 $ 会在每个换行处进行匹配,因此锚定测试回答的会是“是否有任意一行匹配”,而不是“整个文本是否匹配”。工具会在这项检查中移除 m,但保留 i 和 s,因为后两个标志改变的是模式匹配的内容,而不是定位符所在的位置。因此,结果始终针对完整文本,包括其中的换行符。
示例
模式:\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 或 b | cat|dog | "cat"、"dog" |
还有两个值得了解的功能。前瞻写作 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",尽管 2 月从来没有 30 天。
常见问题
什么是正则表达式?
正则表达式是一串定义搜索模式的字符。大多数编程语言和文本编辑器都使用它来搜索、匹配和编辑文本。
全局标志有什么作用?
没有全局标志时,搜索通常会在找到第一个匹配后停止。使用全局标志(g)后,搜索会继续进行,并报告文本中的所有匹配。无论选择了哪个标志,此工具在统计匹配数量时都会搜索所有匹配。
如何匹配字面意义上的点号或其他特殊字符?
在字符前加反斜杠。例如,\. 匹配字面意义上的点号,而不是未转义的 . 所表示的“任意字符”。
.* 和 .*? 有什么区别?
.* 是贪婪匹配,会尽可能多地匹配字符。.*? 是惰性匹配,在仍能使模式其余部分成功的前提下,尽可能少地匹配字符。
为什么每一行都匹配,但工具却说文本没有完全匹配?
完整文本检查会将文本视为一个字符串,其中包括换行符。模式 \d+ 可以分别匹配两行中的 12 和 34,但包含两行及其之间换行符的整体文本并不全是数字,因此完整文本检查结果为否。若要匹配跨越多行的文本,模式也必须覆盖换行符,例如使用 [\s\S]+。
如何检查整个字符串是否匹配模式,而不是只匹配其中一部分?
在模式开头添加 ^,在结尾添加 $。例如,^[0-9]+$ 可用于匹配只包含数字的字符串。
这个测试器遵循其他编程语言的正则表达式规则吗?
此工具使用 JavaScript 内置的正则表达式引擎。字符类和数量词等大多数核心语法在 Python、Java 和 Perl 等语言之间是共通的,但具体细节有所不同,因此在此处有效的模式不一定会在所有环境中表现完全相同。
参考资料
- "Regular expression." Wikipedia, Wikimedia Foundation. https://en.wikipedia.org/wiki/Regular_expression
- MDN Web Docs. "Regular expressions." Mozilla. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
- Friedl, J. E. F. (2006). Mastering Regular Expressions. O'Reilly Media.