正则表达式可移植性检查器
粘贴正则表达式(裸模式或 JS 的 `/pattern/flags` 形式),检查同一模式在 Python `re` 或 PCRE 系列引擎(PHP、Perl)下哪些部分会失败或静默表现不同,以及原因。
在您的浏览器中本地处理。文件绝不会被上传。
使用方法 工具
- 粘贴裸正则(如 `\d{4}-\d{2}`)或带分隔符模式(`/\d{4}-\d{2}/g`);内容不会离开浏览器。
- 选择“检查模式”。
- 查看每个标记结构:是在其他环境语法错误、静默改变行为,还是单向兼容提示。
- 仅在提供时使用建议改写;占有量词、原子组和递归等结构在 JS 中没有简单机械等价项,工具会解释而不是猜测。
假设条件
- 对模式源码进行静态文本扫描,不是正则引擎;绝不对样本文本执行模式,也不解析完整正则语法(字符类、嵌套组及规则未特别涉及的转义边界情况)。
- 比较范围限于三个生态系统:JavaScript(ECMAScript)RegExp 作为来源环境、Python `re` 模块和 PCRE 系列(PHP `preg_*` 与 Perl 正则均与其紧密相关)。
- 只标记有文档记录的规范级差异;不常见的引擎专属细节和版本错误不在范围内。
来源与参考数据
方法说明
去除可选 `/pattern/flags` 分隔符后,扫描八种会导致跨语言可移植性问题的结构:Python 专属命名组和命名反向引用语法、占有量词、原子组、`\A`/`\Z`/`\z` 锚点、PCRE 递归模式引用、模式中途的内联标志,以及 `\d`/`\w`/`\s` 的 ASCII 与 Unicode 默认差异。每种使用窄范围的针对性匹配,而非通用正则解析器。只有改写在机械上安全且无歧义时才提供。
计算示例
`\A` 和 `\Z` 锚点
输入项: /\Afoo.*bar\Z/
结果: JavaScript 没有 `\A` 或 `\Z` 锚点,会静默将其读作字面字母“A”和“Z”,因此模式匹配完全不同的内容,而不是编译失败。正因其会静默失效而标记为错误。
Python 风格命名组
输入项: (?P<year>\d{4})
结果: `(?P<year>...)` 在 JavaScript 中是 SyntaxError;JS 要求 `(?<year>...)`,不带 `P`。安全改写是移除 `P`;PCRE 和 .NET 也接受普通形式。
占有量词和原子组
输入项: (?>a++)b
结果: `(?>...)`(原子组)和 `a++`(占有量词)均为 PCRE/Java 结构,JavaScript 没有对应语法。标记为错误但不自动改写;在 JS 中重现其效果需通过捕获式前瞻重构模式,不能简单替换文本。
Python 风格起始锚点
输入项: /\Afoo/
结果: Python 和一些其他引擎用 `\A` 表示字符串绝对起点。JavaScript 没有该锚点:在 JS 模式中此转义不锚定起点,可能被视为恒等转义并匹配 `A`。检查器只扫描模式文本,不对样例字符串执行它。
实用指南
- 同一模式可能在 JavaScript 中运行时,不要依赖 `\A` 或 `\Z`/`\z`;可使用 `^`/`$`,并明确关闭 `m` 标志,再核实所需的末尾换行行为。
- 若模式需同时在 JavaScript 和 Python 中运行,优先采用 `(?P<name>...)`:Python 要求此写法,PCRE/.NET 也接受。纯 JS 更偏好不带 P 的形式,因此命名组语法并非两者通用。
- 将占有量词、原子组和递归模式视为需要重构(或使用真正解析器)的信号;它们在 JavaScript 中没有可直接替换的语法。
常见错误
- 认为能在 JS 编译通过就与 Python/PCRE 等价;`\A`/`\Z` 和 `\d`/`\w`/`\s` 的 Unicode 默认差异都可能编译成功却匹配不同内容。
- 认为 `(?<name>...)` 到处可移植;它在 JS、PCRE 和 .NET 中有效,但 Python `re` 会拒绝,必须带 `P`。
常见问题
为什么 `\A`/`\Z` 比占有量词或原子组更危险?
占有量词和原子组在 JavaScript 中会触发 SyntaxError 或类似立即错误,问题明显。`\A` 和 `\Z` 可以编译成功,却静默匹配字母“A”/“Z”而非锚定;直到真实输入表现异常才可能发现。
为什么 JS 建议 `(?<name>...)`,却对 Python 标记警告?
正确写法取决于引擎:JS/PCRE/.NET 使用无 P 形式,Python 则要求带 P。工具不知道你要针对哪个环境,因此会报告两个方向;只对明确无效的 JS 写法(粘贴 Python `(?P<name>...)`)强制改写。
工具能自动修复占有量词或原子组吗?
不能。在 JavaScript 中通常需要通过捕获式前瞻模拟原子组(`(?=(pattern))\1`),这会改变模式结构,不只是文本,因此应由模式维护者判断,工具不会猜测。
上次审核: 2026-09-25
这是逐结构检查的窄范围文本扫描器,不是正则解析器或引擎:只识别八种有文档记录的可移植性问题,不涵盖不常见引擎扩展、嵌套组边界情况或实际匹配行为。绝不对样本输入执行模式。
主题和工具偏好设置,以及已保存和最近使用的列表仅存储在此浏览器中。