正则表达式性能测试
测试正则表达式的执行性能,对比多个正则的效率,识别灾难性回溯风险
g / i / m / s
常用性能对比场景(点击加载)
字符类
| 语法 | 说明 | 示例 | 匹配 |
|---|---|---|---|
. | 匹配除换行符外的任意单个字符 | a.c | abc、a1c、a_c |
\d | 匹配数字,等价于 [0-9] | \d{3} | 123、456 |
\D | 匹配非数字,等价于 [^0-9] | \D+ | abc、你好 |
\w | 匹配字母、数字、下划线,等价于 [a-zA-Z0-9_] | \w+ | hello、user_1 |
\W | 匹配非单词字符 | \W+ | 空格、标点 |
\s | 匹配空白字符(空格、Tab、换行等) | a\sb | a b |
\S | 匹配非空白字符 | \S+ | hello、123 |
[abc] | 字符集,匹配括号内任意一个字符 | [aeiou] | a、e、i、o、u |
[^abc] | 排除字符集,匹配不在括号内的字符 | [^0-9] | 字母、符号 |
[a-z] | 字符范围,匹配 a 到 z 之间的字符 | [a-zA-Z] | 任意英文字母 |
量词
| 语法 | 说明 | 示例 | 匹配 |
|---|---|---|---|
* | 匹配前面的元素零次或多次(贪婪) | ab*c | ac、abc、abbc |
+ | 匹配前面的元素一次或多次(贪婪) | ab+c | abc、abbc(不匹配 ac) |
? | 匹配前面的元素零次或一次 | colou?r | color、colour |
{n} | 恰好匹配 n 次 | \d{4} | 2024、1234 |
{n,} | 至少匹配 n 次 | \d{3,} | 123、12345 |
{n,m} | 匹配 n 到 m 次 | \d{2,4} | 12、123、1234 |
*? | 非贪婪匹配(尽可能少匹配) | <.+?> | 匹配最短的 HTML 标签 |
+? | 非贪婪的一次或多次 | \d+? | 尽可能少的数字 |
锚点与边界
| 语法 | 说明 | 示例 | 匹配 |
|---|---|---|---|
^ | 匹配字符串(或行)的开头;m 模式下匹配每行开头 | ^Hello | 以 Hello 开头的字符串 |
$ | 匹配字符串(或行)的结尾;m 模式下匹配每行结尾 | world$ | 以 world 结尾的字符串 |
\b | 单词边界,匹配单词与非单词字符之间的位置 | \bcat\b | cat(不匹配 catch 中的 cat) |
\B | 非单词边界 | \Bcat\B | concatenate 中间的 cat |
分组与引用
| 语法 | 说明 | 示例 | 说明 |
|---|---|---|---|
(abc) | 捕获组,将括号内内容作为整体,并记录匹配结果 | (ab)+ | 匹配 ab、abab、ababab |
(?:abc) | 非捕获组,分组但不记录匹配结果,性能更好 | (?:ab)+ | 同上,但不捕获 |
(?<name>abc) | 命名捕获组,通过名称引用捕获结果 | (?<year>\d{4}) | 捕获年份并命名为 year |
\1、\2 | 反向引用,引用第 n 个捕获组的内容 | (\w+)\s\1 | 匹配重复单词,如 "the the" |
a|b | 或运算,匹配 a 或 b | cat|dog | cat 或 dog |
预查(零宽断言)
| 语法 | 说明 | 示例 | 匹配 |
|---|---|---|---|
(?=abc) | 正向先行断言:后面必须跟着 abc(不消耗字符) | \d+(?=px) | 匹配 12px 中的 12 |
(?!abc) | 负向先行断言:后面不能跟着 abc | \d+(?!px) | 匹配不跟 px 的数字 |
(?<=abc) | 正向后行断言:前面必须是 abc(ES2018+) | (?<=\$)\d+ | 匹配 $100 中的 100 |
(?<!abc) | 负向后行断言:前面不能是 abc(ES2018+) | (?<!\$)\d+ | 匹配不跟在 $ 后的数字 |
修饰符(Flags)
| 标志 | 说明 | 示例 |
|---|---|---|
g | 全局匹配,找到所有匹配项(不加则只匹配第一个) | /\d+/g 匹配所有数字 |
i | 忽略大小写 | /hello/i 匹配 Hello、HELLO |
m | 多行模式,^ 和 $ 匹配每行的开头和结尾 | /^\d/m 匹配每行开头的数字 |
s | dotAll 模式,. 可匹配换行符(ES2018+) | /a.b/s 匹配跨行的 a 和 b |
u | Unicode 模式,正确处理 Unicode 字符(如 emoji) | /\p{L}/u 匹配任意字母 |
gi | 组合使用:全局 + 忽略大小写 | /hello/gi |
转义字符
| 语法 | 说明 |
|---|---|
\.、\*、\+ | 转义特殊字符,使其作为字面量匹配(需转义的字符:. * + ? ^ $ { } [ ] | ( ) \) |
\n | 换行符 |
\t | 制表符(Tab) |
\r | 回车符 |
\uXXXX | Unicode 字符,如 \u4e2d 匹配"中" |
常用正则速查
| 场景 | 正则表达式 | 说明 |
|---|---|---|
| 非空字符串 | ^.+$ | 至少包含一个非换行字符 |
| 纯数字 | ^\d+$ | 整行全为数字 |
| 正整数 | ^[1-9]\d*$ | 不含 0 开头 |
| 浮点数 | ^-?\d+(\.\d+)?$ | 可选负号和小数部分 |
| 字母数字 | ^[a-zA-Z0-9]+$ | 仅含字母和数字 |
| 去除首尾空格 | ^\s+|\s+$ | 配合 replace 使用 |
| 重复单词 | \b(\w+)\s+\1\b | 利用反向引用检测重复 |
| 提取括号内容 | \(([^)]+)\) | 捕获组获取括号内文本 |
关于正则表达式性能测试
- 正则表达式的性能差异可能非常显著,不同写法的正则在处理相同文本时耗时可能相差数百倍
- 灾难性回溯(Catastrophic Backtracking)是正则性能问题的主要来源,可能导致程序挂起甚至崩溃
- 通过对比测试,可以找到功能相同但性能更优的正则写法,优化应用性能
操作说明
- 在「测试文本」区域输入待匹配的文本,在「正则表达式列表」中每行输入一个正则
- 选择迭代次数(次数越多结果越准确,但耗时越长),点击「开始测试」
- 结果按执行时间从快到慢排序,并显示相对性能比较
- 从示例库点击场景可快速加载预置的性能对比示例
- 修饰符输入框支持 g(全局)、i(忽略大小写)、m(多行)、s(dotAll)等标志
注意事项
- 迭代次数设置过高(如100,000次)配合复杂正则可能导致浏览器短暂无响应,请谨慎使用
- 测试结果受浏览器 JavaScript 引擎影响,与服务端(Java、Python、.NET)的实际性能可能有差异
- 存在嵌套量词(如
(a+)+)的正则有灾难性回溯风险,工具会自动检测并警告 - 所有处理均在浏览器本地完成,不会上传任何数据