提示

正则表达式测试器:我终于不用靠“蒙”来写匹配规则了(附 VidDown 工具集介绍)

以前写正则,全靠网上抄例子。匹配邮箱抄一个,匹配手机号抄一个,有时候抄过来不对,还得一行行调试。后来我做了这个正则表达式测试器——输入正则和文本,实时高亮匹配结果,还能看每个匹配的位置。这篇文章分享正则的基础语法、工具的用法、以及我踩过的那些坑。

本文工具由 VidDown 提供 —— 一个完全免费、无需登录、纯前端处理的在线工具集。除了正则测试器,还提供视频解析下载、JSON 格式化、PDF 合并、IP 子网分析等 20+ 实用功能。所有操作在浏览器本地完成,不上传任何数据。
🌐 主站:https://www.viddown.cn
🔧 本文专属工具:正则表达式测试器

一、这个工具能做什么?

正则表达式测试器用于在线编写、测试、调试正则表达式,支持:

  • 实时匹配:输入正则和文本,高亮显示所有匹配项。
  • 匹配位置:显示每个匹配的起始位置和结束位置(字符索引)。
  • 修饰符支持:全局(g)、忽略大小写(i)、多行(m)、点号匹配换行(s)、Unicode(u)、粘性(y)。
  • 替换预览:输入替换文本,预览替换后的结果和替换次数。
  • 常用预设:一键填充邮箱、URL、手机号、IP地址、IPv6、MAC地址、身份证、邮政编码、数字、中文、日期等常见正则。
  • 转义正则:将普通字符串中的正则特殊字符自动转义,方便作为字面量使用。
  • 导出 JSON:将匹配结果导出为 JSON 格式,方便程序调用。

二、正则表达式是什么?

💡 术语解释:正则表达式(Regular Expression)是一种用特定符号描述字符串模式的“小语言”,用于查找、匹配、替换文本。

最简单的正则就是直接写字符。例如正则 abc 匹配文本中的 "abc"。

但真正强大的是元字符量词

符号 含义 例子
. 匹配任意单个字符(除换行符) a.c 匹配 "abc"、"aAc"
\d 匹配任意数字(0-9) \d\d 匹配 "12"
\w 匹配字母、数字、下划线 \w+ 匹配 "hello123"
\s 匹配空白字符(空格、制表符等) a\sb 匹配 "a b"
* 匹配前一个字符0次或多次 a* 匹配 ""、"a"、"aa"
+ 匹配前一个字符1次或多次 a+ 匹配 "a"、"aa"
? 匹配前一个字符0次或1次 a? 匹配 ""、"a"
{n} 匹配前一个字符恰好 n 次 \d{4} 匹配四位数字
{n,m} 匹配前一个字符 n 到 m 次 \d{2,4} 匹配 2-4 位数字
[abc] 匹配括号内任意一个字符 [aeiou] 匹配任意元音字母
[^abc] 匹配不在括号内的任意字符 [^0-9] 匹配非数字
^ 匹配字符串开头 ^http 匹配以 http 开头的行
$ 匹配字符串结尾 \.html$ 匹配以 .html 结尾的行
| cat|dog 匹配 "cat" 或 "dog"
() 分组,捕获子匹配 (\d{4})-(\d{2}) 匹配日期并捕获年份和月份
(?:) 非捕获分组 只分组不捕获
\b 单词边界 \bcat\b 匹配单词 "cat",不匹配 "catalog"

编程语言中如何使用正则(代码示例)

Python(re 模块)

import re

text = "abc123def456ghi789"
pattern = r'\d+'

# 查找所有匹配
matches = re.findall(pattern, text)
print(matches)  # ['123', '456', '789']

# 查找匹配位置
for match in re.finditer(pattern, text):
    print(f"匹配: {match.group()}, 位置: {match.start()}-{match.end()}")

JavaScript

const text = "abc123def456ghi789";
const pattern = /\d+/g;
let matches = [...text.matchAll(pattern)];
matches.forEach(m => console.log(`匹配: ${m[0]}, 位置: ${m.index}-${m.index + m[0].length}`));

Java

import java.util.regex.*;

String text = "abc123def456ghi789";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    System.out.println("匹配: " + matcher.group() + ", 位置: " + matcher.start() + "-" + matcher.end());
}

Go

package main

import (
    "fmt"
    "regexp"
)

func main() {
    text := "abc123def456ghi789"
    re := regexp.MustCompile(`\d+`)
    matches := re.FindAllString(text, -1)
    fmt.Println(matches) // [123 456 789]
}

本工具的作用:先用在线工具调通正则表达式,再复制到代码中,避免反复编译运行。

三、如何使用这个工具?

3.1 基本匹配

1、在「正则表达式」输入框中输入正则,例如 \d+(匹配一个或多个数字)。
2、在「测试文本」中输入 abc123def456ghi789。
3、点击「测试匹配」。
4、下方会显示:
匹配结果:共找到 3 个匹配项,分别是 "123"、"456"、"789"。
每个匹配的位置(起始-结束索引)。
文本中匹配的部分会被高亮显示(橙色背景)。

3.2 使用修饰符

  • g(全局):查找所有匹配,而不是找到第一个就停止。
  • i(忽略大小写):匹配时不区分大小写。例如正则 a 可匹配 "A"。
  • m(多行):让 ^ 和 $ 匹配每一行的开头和结尾,而不只是整个字符串的开头和结尾。
  • s(点号匹配换行):让 . 也能匹配换行符 \n。
  • u(Unicode):支持 Unicode 字符(如 emoji、中文)。
  • y(粘性):从 lastIndex 位置开始匹配(高级用法)。

勾选需要的修饰符后,重新点击「测试匹配」即可。

3.3 替换功能

1、在「替换文本」输入框中输入要替换成的内容,例如 数字。
2、点击「替换」,下方会显示替换后的完整文本以及替换次数。
3、例如将上述例子中的 \d+ 替换为 数字,结果为 abc数字def数字ghi数字。

3.4 使用预设快速填充

  • 工具提供了常用预设按钮:
  • 邮箱
  • URL
  • 手机号(中国)
  • IP地址
  • IPv6
  • MAC地址
  • 身份证(18位)
  • 邮政编码
  • 数字
  • 中文
  • 日期(YYYY-MM-DD)

点击任一按钮,正则输入框会自动填入对应的表达式。例如点击「邮箱」,填入 [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}。

3.5 转义正则

当你有一段普通字符串,里面包含正则特殊字符(如 .、*、?、+、[、( 等),想把它作为正则的字面量来匹配时,点击「转义正则」,工具会自动给这些特殊字符加上反斜杠 \。例如输入 1.2.3,转义后变成 1.2.3。

3.6 导出 JSON

点击「复制 JSON」按钮,可将当前匹配结果(包括匹配的文本、位置、索引等)导出为 JSON 格式并复制到剪贴板,方便在代码中使用。

四、常见正则示例与代码结合

需求 正则表达式 Python 示例
匹配邮箱 [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,} re.findall(pattern, text)
匹配 URL https?://[^\s]+ re.search(pattern, text)
匹配中国手机号 1[3-9]\d{9} re.match(pattern, phone)
匹配 IPv4 \b((25[0-5] 2[0-4]\d
匹配中文 [\u4e00-\u9fa5]+ re.findall(pattern, chinese_text)

实战案例:提取文本中的所有邮箱和手机号

import re

text = "联系我:zhang@example.com 或 13812345678,备用: li@test.com"
email_pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
phone_pattern = r'1[3-9]\d{9}'

emails = re.findall(email_pattern, text)
phones = re.findall(phone_pattern, text)
print("邮箱:", emails)   # ['zhang@example.com', 'li@test.com']
print("手机号:", phones) # ['13812345678']

先用在线工具测试正则是否正确,再嵌入代码,效率翻倍。

五、踩坑汇总(我全遇到过)

1. 忘记转义点号 .

错误:想匹配文件扩展名 .txt,写了 .txt 但漏了反斜杠成了 .txt,结果匹配了 "atxt"、"btxt"。
正确:使用 .txt,点号要转义。

2. 量词默认是贪婪匹配

现象:正则 <.> 匹配

text
时,会匹配整个字符串(从第一个 < 到最后一个 >),而不是每个标签。
解决:使用非贪婪量词 <.
?>,它会匹配最短的可能。

3. 多行模式下 ^ 和 $ 的行为

现象:用 ^abc 匹配多行文本中的行首 "abc",但没有勾选「m」修饰符,结果匹配不到。
解决:勾选「m」(多行),^ 和 $ 才会匹配每一行的开头和结尾。

4. 正则中的空格容易被忽略

现象:正则 a b 中的空格不会被当成普通空格处理,除非显式写上 \s。
解决:要么用 \s 匹配空白,要么确保正则中不要有多余空格。

5. 字符类 [] 内部无需转义大多数符号

现象:想匹配 [abc] 字符本身,写了 [abc] 没问题。但如果写 [[]] 会混乱。
解决:在 [] 内部,只有 ^、-、] 需要特殊处理,其他元字符一般不需要转义。推荐直接用 \Q \E 或手动转义。

6. Unicode 字符匹配需要 u 修饰符

现象:用 \w 匹配中文,结果匹配不到。
解决:勾选「u」修饰符,或直接使用 [\u4e00-\u9fa5]。

六、与命令行对比

方式 优点 缺点
本工具 (网页版) 可视化、高亮、位置信息、预设丰富
grep -E Linux 自带,适合快速匹配 无高亮,无交互
sed 适合批量替换 学习曲线陡峭
Python re 模块 功能强大,可编程 需要写代码,调试不便

七、一点小建议

  • 测试正则先从小文本开始:不要直接对着大文件调,用工具先在小段文本上验证。
  • 善用预设:常见格式(邮箱、手机号等)直接用预设,不用自己写。
  • 记住转义:正则中所有元字符(. * + ? ^ $ | ( ) [ ] { } \)如果要匹配其本身,前面加反斜杠。
  • 使用非捕获分组:如果只需要分组功能而不需要捕获,用 (?:...),性能更好。
  • 匹配位置很关键:工具显示的位置索引可以帮助你理解为什么某些字符没被匹配。
  • 将工具结果导出 JSON:方便在自动化脚本中解析匹配数据。

八、总结

正则表达式是编程和运维中的一把利器,但调试起来非常折磨。VidDown 的正则测试器通过实时高亮、位置显示、替换预览和预设模板,让你能快速写出正确的正则。

如果你还没试过,现在就去 https://www.viddown.cn/tools/regex-tester/ 体验一下。

下次你写正则时,不需要再反复 console.log 或 print 了——交给工具就好。

附录:常用正则速查表

需求 正则
数字 \d+
字母(大小写) [A-Za-z]+
中文 [\u4e00-\u9fa5]+
空白行 ^\s*\n
HTML 标签 <[^>]*>
手机号(中国) 1[3-9]\d{9}
邮箱 \w+@\w+.\w+(简化版)
IP 地址 \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}(简化版)

关于 VidDown
VidDown 还提供视频解析下载、JSON 格式化与差异对比、PDF 合并压缩、IP 子网分析、Cron 表达式生成等 20+ 工具。所有工具完全免费、无需登录、纯前端本地处理,不泄露隐私。
🔗 主站:https://www.viddown.cn

版权声明:本文为 VidDown 原创,欢迎分享,请保留出处。

顶部
×
🔖
收藏本站
将本站添加到浏览器书签,方便下次访问
Ctrl + D (Windows/Linux)
+ D (Mac)