regex
正则表达式调试
在浏览器本地执行正则匹配,展示捕获组、命名组与索引位置,不发送任何数据。
/
/
技术说明
正则表达式由字面量字符与元字符组成,元字符赋予模式匹配能力,例如 . 匹配任意字符、* 表示重复零次或多次、[] 表示字符集。各语言的正则实现存在方言差异,常见的有 PCRE、ECMAScript 与 RE2 等。
JavaScript 的 RegExp 遵循 ECMAScript 规范,支持命名捕获组、后行断言与 Unicode 属性转义。全局标志 g 会让匹配在字符串中迭代推进,此时调用 test() 会改变 lastIndex,连续调用可能出现交替命中的现象,这是使用中较易出错的一点。
正则引擎按回溯行为分为两类:回溯型引擎表达能力强,但在嵌套量词下可能出现指数级回溯;自动机型引擎保证线性时间,但不支持反向引用与后行断言。编写模式时应避免 「嵌套量词作用于可重叠的字符集」这类结构。
常见问题
- 为什么带 g 标志的 test() 会出现真假交替?
- 因为带 g 的正则对象会在实例上记录 lastIndex,下次匹配从该位置继续。若需要在循环中判断,应每次重置 lastIndex,或改用 matchAll。
- 什么是灾难性回溯?
- 指引擎在失败路径上反复回溯、耗时呈指数增长的情形。典型成因是嵌套量词匹配了可重叠的字符集,例如 (a+)+ 作用于长串的 a。
- 贪婪、懒惰与独占量词有什么区别?
- 贪婪量词先尽可能多匹配再回退;懒惰量词先尽可能少匹配再扩展;独占量词一旦匹配便不回溯,JavaScript 通过后行断言的组合来模拟类似效果。