以前写正则,全靠网上抄例子。匹配邮箱抄一个,匹配手机号抄一个,有时候抄过来不对,还得一行行调试。后来我做了这个正则表达式测试器——输入正则和文本,实时高亮匹配结果,还能看每个匹配的位置。这篇文章分享正则的基础语法、工具的用法、以及我踩过的那些坑。
本文工具由 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. 量词默认是贪婪匹配
现象:正则 <.> 匹配
解决:使用非贪婪量词 <.?>,它会匹配最短的可能。
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 原创,欢迎分享,请保留出处。