正则表达式性能测试

测试正则表达式的执行性能,对比多个正则的效率,识别灾难性回溯风险

g / i / m / s
常用性能对比场景(点击加载)
字符类
语法说明示例匹配
.匹配除换行符外的任意单个字符a.cabc、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\sba b
\S匹配非空白字符\S+hello、123
[abc]字符集,匹配括号内任意一个字符[aeiou]a、e、i、o、u
[^abc]排除字符集,匹配不在括号内的字符[^0-9]字母、符号
[a-z]字符范围,匹配 a 到 z 之间的字符[a-zA-Z]任意英文字母
量词
语法说明示例匹配
*匹配前面的元素零次或多次(贪婪)ab*cac、abc、abbc
+匹配前面的元素一次或多次(贪婪)ab+cabc、abbc(不匹配 ac)
?匹配前面的元素零次或一次colou?rcolor、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\bcat(不匹配 catch 中的 cat)
\B非单词边界\Bcat\Bconcatenate 中间的 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 或 bcat|dogcat 或 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 匹配每行开头的数字
sdotAll 模式,. 可匹配换行符(ES2018+)/a.b/s 匹配跨行的 a 和 b
uUnicode 模式,正确处理 Unicode 字符(如 emoji)/\p{L}/u 匹配任意字母
gi组合使用:全局 + 忽略大小写/hello/gi
转义字符
语法说明
\.\*\+转义特殊字符,使其作为字面量匹配(需转义的字符:. * + ? ^ $ { } [ ] | ( ) \
\n换行符
\t制表符(Tab)
\r回车符
\uXXXXUnicode 字符,如 \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+)+)的正则有灾难性回溯风险,工具会自动检测并警告
  • 所有处理均在浏览器本地完成,不会上传任何数据