实时匹配高亮、常用模板库、分组替换
正则表达式(Regular Expression,简称 Regex)测试器是一款帮助开发者编写、测试和调试正则表达式的在线工具。正则表达式是文本处理的强大工具,用于在字符串中匹配、搜索、替换和提取符合特定模式的内容。从简单的邮箱验证到复杂的日志解析,正则表达式在编程中无处不在。然而,正则表达式的语法复杂且容易出错,一个小小的括号遗漏或贪婪/非贪婪修饰符的误用就可能导致匹配失败或灾难性回溯。本工具提供实时匹配高亮、捕获组展示、匹配详情(起始位置、匹配内容)以及常用正则表达式模板库,帮助开发者快速构建正确的正则表达式。
验证用户输入的邮箱、手机号、身份证号、URL 等格式是否正确。使用正则表达式测试器可以快速验证正则规则能否正确匹配目标格式,同时确保不会误匹配非法输入。
从服务器日志中提取 IP 地址、请求路径、状态码、时间戳等字段。例如用正则从 Apache 日志行中捕获各字段:IP、时间、请求方法、URL、状态码、响应大小。先在测试器中用示例日志行验证正则,再应用到代码中。
使用正则表达式从大段文本中提取特定模式的内容,如提取所有 @提及 的用户名、#话题标签、URL 链接等。或者用捕获组和替换模板完成复杂的文本格式转换。
正则表达式引擎基于有限状态自动机(NFA/DFA)。NFA(非确定有限自动机)支持回溯,功能强大但可能在复杂模式下产生灾难性回溯(catastrophic backtracking)。JavaScript 使用 NFA 引擎。RegExp 对象的 exec() 方法返回包含匹配信息和捕获组的数组,test() 方法返回布尔值。命名捕获组 (?<name>pattern) 让匹配结果更具可读性。
// 邮箱验证正则表达式
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
// 日志解析 - 命名捕获组
const logRegex = /^(?<ip>\d+\.\d+\.\d+\.\d+)\s-\s-\s\[(?<time>.+?)\]\s"(?<method>\w+)\s(?<url>.+?)\s.+?"\s(?<status>\d+)\s(?<size>\d+)/;
const match = logRegex.exec(logLine);
console.log(match.groups.ip); // "192.168.1.1"
console.log(match.groups.status); // "200"
// 注意:避免灾难性回溯
// 错误: (a+)+b 对 "aaaaaaaaac" 会产生指数级回溯
// 正确: a+b 或使用占有量词/原子组
(a+)+)以防止灾难性回溯导致 CPU 占用 100%。(?<name>...) 提高正则的可读性,比数字索引更直观。x 标志或分步构建),方便后续维护和团队协作。A>贪婪匹配(*、+、?、{n,m})会尽可能多地匹配字符;非贪婪匹配(*?、+?、??、{n,m}?)会尽可能少地匹配。例如对 "a]b]c" 用 a.+] 匹配得到 "a]b]"(贪婪到最后一个 ]),用 a.+?] 匹配得到 "a]b"(只到第一个 ])。
A>当正则中存在嵌套量词或交替组合时,引擎可能对某些输入产生指数级的回溯尝试,导致 CPU 卡死。例如 (a+)+b 匹配 "aaaaaaaaac"。避免方法:消除嵌套量词、使用原子组 (?>...)(JS 尚不支持)、或重构正则为确定形式。
A>JavaScript 使用 NFA 引擎,支持回溯。ES2018 新增了命名捕获组、后行断言。但 JS 不支持原子组、占有量词、递归匹配等高级特性。如果需要更强大的正则,可使用 XRegExp 库。正则语法在 Perl、Python、Java 等语言间也有细微差异。
A>使用 Unicode 范围 [一-鿿] 匹配基本汉字。如需包含扩展区,范围更广。ES2018 的 Unicode 属性转义 \p{Script=Han} 配合 u 标志可以更精确地匹配中文字符。
A>使用本工具的匹配详情面板查看回溯次数。也可以使用 console.time() 测量执行时间。更专业的工具如 regex101.com 会显示每一步的回溯过程。对于生产环境的正则,建议用 benchmark.js 进行压力测试。