正则表达式可移植性检查器

粘贴正则表达式(裸模式或 JS 的 `/pattern/flags` 形式),检查同一模式在 Python `re` 或 PCRE 系列引擎(PHP、Perl)下哪些部分会失败或静默表现不同,以及原因。

在您的浏览器中本地处理。文件绝不会被上传。

使用方法 工具

  1. 粘贴裸正则(如 `\d{4}-\d{2}`)或带分隔符模式(`/\d{4}-\d{2}/g`);内容不会离开浏览器。
  2. 选择“检查模式”。
  3. 查看每个标记结构:是在其他环境语法错误、静默改变行为,还是单向兼容提示。
  4. 仅在提供时使用建议改写;占有量词、原子组和递归等结构在 JS 中没有简单机械等价项,工具会解释而不是猜测。

假设条件

来源与参考数据

方法说明

去除可选 `/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`。检查器只扫描模式文本,不对样例字符串执行它。

实用指南
常见错误

常见问题

为什么 `\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

这是逐结构检查的窄范围文本扫描器,不是正则解析器或引擎:只识别八种有文档记录的可移植性问题,不涵盖不常见引擎扩展、嵌套组边界情况或实际匹配行为。绝不对样本输入执行模式。

主题和工具偏好设置,以及已保存和最近使用的列表仅存储在此浏览器中。