Menu

正则表达式测试

测试正则表达式,用动画高亮显示匹配结果。

作者 Nethanel Bar, Co-founder & CEO

最后更新

准备好真正学会编程了吗?

Coddy 让你在浏览器里编写真实代码来学习:互动课程、即时反馈,卡住时还有 AI 帮忙。

正则表达式测试工具是什么?

正则表达式测试工具让你输入一个正则表达式,立刻看到它在示例文本中匹配到了什么。开发者用 regex(正则表达式)来校验输入、从字符串中提取数据、搜索日志、清洗文本、编写编辑器命令,以及制定查找替换规则。

正则表达式一开始看起来很晦涩,因为寥寥几个符号就承载了大量含义。实时测试工具能帮你看懂它:你每输入一个字符,高亮的匹配结果和捕获组都会随之更新,你可以反复尝试,直到模式完全符合你的要求。

不同编程语言使用的正则引擎略有差别(JavaScript、PCRE、Python、Java、Go、.NET)。基础部分,也就是字符、字符类、量词、锚点和分组,在哪里都通用。高级特性(后行断言、命名分组、占有量词)才是各引擎出现分歧的地方。

测试正则时你会学到

  • 模式描述的是文本的形状,而不是它的含义。\d+ 匹配一串数字,但它并不知道这个数字是否合理。
  • 标志会改变匹配行为:g 查找所有匹配,i 忽略大小写,m 让 ^ 和 $ 匹配每行的开头和结尾,s 让 . 也能匹配换行符。
  • 捕获组 (...) 能提取匹配中的一部分,而不只是判断整个字符串是否匹配,这是解析文本的关键。
  • 量词默认是贪婪的(尽可能多地匹配)。在后面加上 ? 就变成惰性的(尽可能少地匹配)。

正则表达式测试工具使用步骤

  1. 输入你的模式

    在模式输入框中输入正则表达式。不要加两边的 / 斜杠,它们是 JavaScript 字面量的语法,不属于模式本身。

  2. 打开需要的标志

    最常用的是 g(查找所有匹配)和 i(不区分大小写)。需要按行使用锚点时用 m,想让 . 匹配换行符时用 s。

  3. 粘贴测试字符串

    把示例文本放进测试区域。匹配结果会随着你的输入高亮显示,捕获组列在匹配列表下方。

  4. 查看匹配面板

    每个匹配都会显示它的位置、完整文本以及捕获到的分组。用它来确认模式匹配到了你想要的内容,并跳过了不想要的内容。

  5. 反复调整直到正确

    收紧量词、添加锚点(^、$),或者转义字面字符(\.、\?),直到匹配结果和分组完全符合你的代码需要。

正则表达式速查表

这 20% 的正则语法,能覆盖你 99% 的日常使用。收藏这一页,这是记住语法最快的方法。完整语法请参阅 MDN 的正则表达式指南。

符号含义示例
.任意单个字符(换行符除外)a.c 匹配 abc、a-c
\d \D数字 / 非数字\d+ 匹配 123
\w \W单词字符(字母/数字/_)/ 非单词字符\w+ 匹配 hello_1
\s \S空白字符 / 非空白字符\s+ 匹配空格和制表符
[abc]a、b、c 中的任意一个[aeiou] 匹配一个元音字母
[^abc]不是 a、b、c 中的任何一个[^0-9] 匹配非数字
* + ?前一项出现 0 次及以上、1 次及以上、0 或 1 次a+ 匹配 a、aaa
{n} {n,m}恰好 n 次 / n 到 m 次\d{3,5} 3 到 5 位数字
^ $字符串的开头 / 结尾(使用 m 时为行的开头 / 结尾)^Error 以 Error 开头的行
(...)捕获组(\d+) 捕获这些数字
(?:...)非捕获组(?:foo|bar) 只分组,不捕获
a|b或运算:a 或 byes|no
\b单词边界\bcat\b 匹配 cat 而不匹配 cats

可以试试的正则表达式示例

匹配简单的邮箱格式

模式
^[\w.+-]+@[\w-]+\.[\w.-]+$
文本

learner@coddy.tech

它能识别 something@something.something 这种基本格式。真实世界中的邮箱校验要宽松得多,表单里更推荐使用 type="email" 再加上服务器端校验。

从句子中提取所有数字

模式
\d+
文本

Lesson 12 has 3 tasks and 2 quizzes.

加上 g 标志后,它会找出每一串数字:12、3、2。\d+ 在正则中的意思就是“一个或多个数字”。

用捕获组从 URL 中提取 id

模式
/users/(\d+)
文本

/users/42/profile

完整匹配是 /users/42,而捕获组 (\d+) 只提取出 42。在代码中真正用上正则匹配结果,靠的就是捕获组。

贪婪量词与惰性量词

贪婪
<.+>
惰性
<.+?>
文本

<b>hello</b>

贪婪版本会匹配整个字符串 <b>hello</b>,因为 .+ 会尽可能多地吞掉字符。惰性版本(+?)在遇到第一个 > 时就停下,所以只匹配 <b> 和 </b>。

正则表达式常见错误

  • 忘记转义特殊字符:.、?、+、(、)、[、]、{、}、\、^、$、|。想按字面意思匹配它们时,要在前面加上 \。
  • 写出的模式只对一个示例有效,遇到带多余空格、换行或缺少字段的真实输入就失败。
  • 贪婪地使用 .*,结果匹配到远超预期的内容。改用 .*? 或更具体的字符类。
  • 试图用正则解析嵌套很深的格式(完整的 HTML、复杂的编程语言、成对的括号)。这时应该用真正的解析器。
  • 忘了加 g 标志,然后奇怪为什么只有第一个匹配被高亮。

正则表达式常见问题

正则表达式是什么?

Regex 是 regular expression(正则表达式)的缩写,是一种用来匹配文本的简洁模式语言。几乎所有编程语言,以及很多编辑器和命令行工具里都有同样的概念。

怎么写正则表达式?
先写出你要匹配的字面字符,再把其中会变化的部分换成字符类(\d、\w、[abc])和量词(*、+、?、{n,m})。用正则测试工具反复调整,直到模式恰好匹配你想要的情况。
正则中的 \w 是什么意思?
\w 匹配一个单词字符,即字母、数字或下划线。\W 正好相反(任意非单词字符)。具体包含哪些字符,取决于引擎和是否开启 Unicode 标志。
为什么我的正则匹配到太多内容?
量词默认是贪婪的,.* 会尽可能多地匹配。改用惰性量词(.*?),或者用更具体的字符类,让它在你想要的位置停下。
JavaScript 的正则和其他语言的正则一样吗?
基础是一样的,但引擎之间有差别。JavaScript、PCRE、Python 的 re、Java、Go 和 .NET 支持的标志和高级特性(后行断言、命名分组、占有量词)各不相同。
初学者应该学正则表达式吗?

应该,但要循序渐进。先学字面字符、字符类、量词、锚点、标志和捕获组。环视断言、命名分组和条件正则留到以后再学。

了解更多

其他开发者工具

Coddy 编程语言插图

和 Coddy 一起学编程

开始