---
name: devtool-regex
description: 正则表达式的生成与解析。Use when 用户要"写正则/生成正则/匹配XX格式"、给出一段正则要求"解释/解析/这个正则什么意思"、要验证或修复一个正则、要提取/校验文本格式（邮箱、手机号、IP、URL、日期等）、或提到 regex、regexp、正则、正则表达式、捕获组、lookahead、回溯等词。
---

# 正则表达式生成与解析

两件事都做：把自然语言需求变成正则（**生成**），把正则翻译成人话（**解析**）。无论哪种，输出都必须经过真实运行验证。

## 铁律（不可违反）

1. **任何正则输出前必须实际运行验证**。禁止给未测试的正则。
2. **生成必须同时有正例和反例**：正例（必须匹配）+ 反例（必须不匹配）。缺一先构造，经用户确认后再生成。只有正例没有反例的正则必然过拟合。
3. **方言敏感**：默认 ECMAScript/JS，用户可指定 python / go / rust / PCRE。不同方言语法有差异（见下方「方言差异表」），必须按目标方言适配，并明确说明所用的方言与 flags。
4. **验证用真实引擎**，不靠脑补。方言对应 runtime：
   - JS → `node -e`
   - python → `python3 -c`
   - go → `go run`（临时文件）
   - rust → 有环境才跑；没有则明确告知「该方言未实跑，仅按规范构造」，不得含糊其辞。

## 方言差异表（生成/解析时必查）

| 特性 | ECMAScript/JS | Python (`re`) | Go (RE2) | PCRE | Rust (`regex`) |
|------|---------------|---------------|----------|------|----------------|
| 命名组 | `(?<name>...)` | `(?P<name>...)` | `(?P<name>...)` | 两者均可 | `(?P<name>...)` |
| 后行断言 lookbehind | ✅（需 ES2018+） | ✅ 定长 | ❌ | ✅ | ❌（不支持） |
| 反向引用 `\1` | ✅ | ✅ | ❌ | ✅ | ❌ |
| 原子组/占有量词 | ❌（2025 后有 proposal） | ❌ | ❌ | ✅ | ❌ |
| 回溯 | ✅ | ✅ | ❌（RE2 无回溯，天然免疫灾难性回溯） | ✅ | ❌ |
| `\d` 是否含 Unicode 数字 | 默认否（无 u flag） | 默认否 | 否 | 视模式 | 否 |

> 规则：目标方言不支持某特性时，换等价写法并解释差异；不要静默降级。

## 模式一 · 生成（自然语言 → 正则）

1. **澄清**（缺什么问什么，一次一个）：
   - 目标字符串样例（正例，最好多个，覆盖边界）
   - 反例（看起来像但必须排除的）
   - 方言与 flags（`g`/`i`/`m`/`u`/`s` 等）
   - 是否需要捕获组 / 命名组，捕获哪一段
2. **逐段拆解**需求 → 拼装正则（锚点、字符类、量词、组、断言）。
3. **实跑验证**：把正例全部应匹配、反例全部应不匹配。任一不过就迭代修正，直到全过。
4. **边界压力**：对可疑的量词/嵌套，用长字符串 + 计时验证是否灾难性回溯（卡死即重写）。
5. **输出**：
   - 正则（含所用方言的转义层级，字符串字面量 vs 正则字面量要分清）
   - flags
   - 逐段解释（每段在匹配什么、为什么这么写）
   - 测试结果表：每个样例 → ✓/✗
   - 已知边界（哪些输入会意外命中/漏掉，如实告知）

## 模式二 · 解析（正则 → 人话）

1. **确认方言与 flags**（不确认就用 JS 默认，并说明假设）。
2. **逐 token 分解**：每个字面量、字符类、量词、锚点、捕获组、断言、反向引用的含义与作用域。
3. **构造正/反例实跑验证**：证明理解正确——正例全匹配、反例全不匹配；若与预期不符，说明是正则本身有坑还是理解偏差。
4. **指出陷阱**，至少检查：
   - 贪婪 vs 懒惰量词（`.*` vs `.*?`）
   - `.` 默认不匹配换行（除非 `s`/DOTALL）
   - `\d`/`\w` 的 Unicode 行为
   - 转义层级（在 JS 字符串里写 `\\d` vs 正则字面量 `/.../` 里的 `\d`）
   - 灾难性回溯（嵌套量词）
   - 锚点 `^`/`$` 在 `m` flag 下的行为变化

## 测试执行规范

- 优先用最短命令实跑，例（JS）：
  ```bash
  node -e 'const re=/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i; for (const s of ["a@b.com","BAD","a@b"]) console.log(JSON.stringify(s), re.test(s));'
  ```
- 输出测试结果表，正例全 ✓、反例全 ✗ 才算完成。
- 若目标方言的 runtime 在本机不存在，明确说「未实跑」，不得伪装成已验证。

## 输出格式约定

- 正则用行内代码包裹，flags 紧随其后，如 `/^foo\d+$/g`。
- 涉及转义层级时，同时给出「正则字面量」和「字符串字面量」两种写法，避免用户踩坑。
- 逐段解释用「正则片段 → 含义」的列表呈现，不用大段散文。
