正则表达式测试
正则表达式测试
支持正则表达式的实时匹配测试,提供标志控制、捕获组解析、命名分组及即时替换预览。支持性能风险检测与超时保护,适用于模式验证、文本提取及批量替换。
快速开始
常见使用场景
数据提取
用 (\\d{4}-\\d{2}-\\d{2}) 提取日期,用 ([\\w.]+@[\\w.]+) 提取邮箱
格式验证
编写正则后粘贴多条样本,快速验证模式是否精准命中目标格式
批量替换
用捕获组重组内容。例如将「姓 名」改为「名, 姓」— 模式 (\\S+)\\s+(\\S+),替换 $2, $1
命名分组
用 (?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2}) 提取日期再用 ${year}/${month}/${day} 重组
语法学习
输入不同模式观察匹配行为,直观理解量词、锚点、字符类的效果
多行处理
开启 m 标志后 ^ 和 $ 按行匹配,适合处理日志、代码或配置文件
使用建议
限制与兼容性
隐私与安全
常见问题
正则表达式(Regular Expression,简称 regex)是一种用特定语法描述文本模式的工具。你可以把它理解为「高级搜索」——不是搜索一个固定词,而是搜索符合某种规则的所有文本。\n\n例如 \\d{4}-\\d{2}-\\d{2} 可以匹配所有「年-月-日」格式的日期,[\\w.]+@[\\w.]+ 可以匹配邮箱地址。正则表达式广泛用于:文本搜索与提取(从日志中找错误码)、格式验证(检查手机号是否合法)、批量替换(把所有日期从 MM/DD/YYYY 改为 YYYY-MM-DD)。\n\n几乎所有编程语言(JavaScript、Python、Java、Go 等)和大量工具(VS Code、grep、sed)都支持正则表达式,语法大同小异。本工具使用 JavaScript 的 RegExp 引擎,适合在线快速验证和学习。
JavaScript 正则默认只返回第一个匹配项,这是语言规范行为而非工具限制。点击标志栏中的 g 开启全局搜索即可看到全部匹配。\n\n需要注意 g 和 y 的交互:g 从头到尾扫描整个文本,而 y(定点匹配)要求每次匹配必须紧接上次匹配的末尾——如果目标文本中的匹配项之间有间隔字符,y 会在遇到第一个间隔时停止。通常只开 g 不开 y 就够用了。
常见原因有四类:\n\n1. 括号未配对:每个 ( 必须有对应的 ),每个 [ 必须有对应的 ]。IDE 中可能会自动补全,但本工具需要手动保证配对。\n2. 量词位置错误:量词(*、+、?、{n})必须跟在可量化的元素后面。*+ 或 ?* 这类连写是非法的,除非前一个量词是 ? 用于惰性修饰(如 *?)。\n3. 转义不完整:单独的 \\ 在末尾是非法的,必须转义一个具体字符(如 \\d、\\n、\\\\)。\n4. Unicode 属性需要 u 标志:\\p{L}、\\p{Script=Han} 等 Unicode 属性转义在未开启 u 标志时会报错,点击 u 按钮启用即可。
这些是 JavaScript String.prototype.replace() 定义的替换引用语法:\n\n- $1、$2、...、$99:引用正则中第 n 个捕获组 (...) 的匹配内容\n- $&:引用整个匹配的完整文本\n- $`:引用匹配位置之前的文本\n- $':引用匹配位置之后的文本\n- ${name}:引用命名组 (?<name>...) 的匹配内容\n\n例如用模式 (\\w+)\\s(\\w+) 匹配「hello world」,替换为 $2-$1 得到「world-hello」。如果替换文本中需要字面的 $ 符号,写 $$ 即可转义。
超时几乎都是「灾难性回溯」造成的。当正则引擎遇到嵌套量词(如 (a+)+b)或多个重叠的可选路径时,它会回溯尝试指数级数量的排列组合,导致匹配时间爆炸。\n\n典型的危险模式:(a+)+、(.*?)*(、(.+)+$ 等。解决方法:\n1. 用精确的字符类替代 .,例如 [^\\s]+ 替代 .+\n2. 避免嵌套量词,将 (a+)+ 改为 a+\n3. 减少可选路径的重叠,例如 (a|ab)+ 改为 a+b?\n\n调整模式后点击匹配结果区的「重试」按钮重新测试。工具设有 4 秒超时保护,不会导致浏览器卡死。
不同语言的正则引擎存在语法和行为差异,主要体现在三方面:\n\n1. 语法支持范围不同:JavaScript 不支持 PCRE 的递归模式 (?R)、条件分支 (?(cond)yes|no)、原子组 (?>...) 等。Python 的 re 模块也不支持这些,但 regex 模块支持。Java 支持原子组但不支持递归。\n2. Unicode 处理差异:Python 3 的 re 默认按 Unicode 处理 \\w、\\d,JavaScript 默认按 ASCII 处理——需手动开启 u 标志。这意味着 \\w 默认不匹配中文,\\b 的单词边界也不适用于中文字符间。\n3. 换行符语义不同:Python 的 . 默认不匹配 \\n(与 JavaScript 相同),但 Java 的 Pattern.DOTALL 和 JavaScript 的 s 标志行为一致。\n\n建议:在本工具中快速验证逻辑后,最终以目标语言的引擎做确认。