# Regex Buddy

> 【正则表达式】自然语言描述生成正则 + 逐段解释 + 测试用例。触发时机：用户说"写个正则"、"正则匹配"、"regex"、"解释正则"时。

- Skill: `afine907/regex-buddy` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add afine907/regex-buddy`
- Raw SKILL.md: https://api.skillmd.com/api/skills/afine907/regex-buddy/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: afine907 (https://skillmd.com/u/afine907)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/afine907/regex-buddy

---


# Regex Buddy — 正则表达式 Agent

自然语言描述 → 正则 + 逐段解释 + 测试用例，一次输出。


## Goal

自然语言描述 → 正则表达式 + 逐段解释 + 测试用例。一次输出，无需多轮迭代


## Trigger

- 用户说"写个正则"、"正则匹配"、"regex"
- 用户要求校验、解释或优化已有的正则表达式
- 用户需要从文本中提取内容或做格式校验


## 工作流程

### 三条路径

```
路径A - 标准生成（用户描述需求）：
描述 → 选构造策略 → 编写正则 → 逐段解释 → 生成测试用例 → 标记边界

路径B - 审查/解释（用户给已有正则）：
提取正则 → 逐段解析含义 → 输出 explain 报告 → 评价格式和可优化点

路径C - 输入模糊（需求不清晰）：
追问具体匹配目标、语言/引擎 → 回到路径A
```

## 构造策略

| 场景 | 策略 | 适用判断 | 示例 |
|------|------|----------|------|
| **格式校验** | 边界锚定 `^...$` + 字符类 | 单一格式约束（手机号/邮箱/IP） | `^1[3-9]\d{9}$` |
| **多条件校验** | 前瞻/后顾 `(?=...)` + 锚定 | 联合条件（密码强度/同时包含多种字符） | `^(?=.*[A-Z])(?=.*\d).{8,}$` |
| **提取** | 捕获组 `()`，避免贪婪 | 从文本中抽取部分内容 | `id=(\d+)` |
| **替换** | 捕获组 + 反向引用 | 格式转换、脱敏、重排 | `s/(\d{4})-(\d{2})/$2-$1/` |
| **分割** | 用 `[^...]+` 取反集 | 简单分隔结构 | `[^:]+` 匹配 key:value 对 |

注意：CSV 等复杂结构化格式建议用专用解析器（Python csv 模块等），正则难以正确处理转义和引号。

## 输出模板

```json
{
  "description": "用户原始描述",
  "target_language": "pcre | python | javascript | go | auto",
  "regex": "最终正则表达式",
  "flags": ["g", "i", "m"],
  "explanation": [
    {"part": "^", "meaning": "字符串开头"},
    {"part": "\\d{3}", "meaning": "匹配 3 位数字"}
  ],
  "test_cases": [
    {"input": "example", "expected": true, "reason": "符合格式要求"},
    {"input": "bad", "expected": false, "reason": "缺少必要部分"}
  ],
  "edge_cases": ["空字符串", "超长输入", "特殊字符", "Unicode"],
  "alternatives": [
    "仅当存在显著性能差异、跨引擎兼容性差异或可读性明显提升时提供，否则空数组"
  ],
  "notes": [
    "性能警告（如灾难性回溯风险）",
    "引擎兼容性说明（如 lookbehind 在旧 JS 引擎不支持）",
    "默认假设说明"
  ]
}
```

**字段说明**：
- `target_language`：用户未指定时默认 `pcre`，输出中标注假设。Python 用 `(?P<name>)`，JS/PCRE 用 `(?<name>)`
- `test_cases`：至少 4 个（2 个正例 + 2 个反例），覆盖正常场景和至少 1 个边界场景
- `alternatives`：仅当存在显著差异时提供，否则 `[]`
- `notes`：包括性能风险、兼容性限制、默认假设等

## 最佳实践

| 规则 | 说明 |
|------|------|
| **避免贪婪** | 用 `*?` `+?` 替代 `*` `+`，除非确定要贪婪 |
| **锚定边界** | 校验用 `^...$`，搜索不需要 |
| **命名捕获组** | 通用语法 `(?<name>...)`（PCRE/JS/Go）；Python 用 `(?P<name>...)` |
| **转义要完整** | `. \| ( ) [ ] { } ^ $ * + ?` 这些都需要转义 |
| **不要过度复杂** | 多个简单正则比一个巨无霸好维护 |

## 快速使用

以下示例展示用户触发本 skill 的典型输入模式：

```
# 写正则（路径A：标准生成）
写个正则匹配中国大陆手机号

# 替换（路径A）
把 YYYY-MM-DD 格式的日期换成 MM/DD/YYYY

# 校验正则（路径B：审查/解释）
帮我校验这个正则：/^[\w\.-]+@[\w\.-]+\.\w+$/

# 解释正则（路径B）
解释一下这个正则什么意思：/^(?=.*[A-Z])(?=.*\d).{8,}$/

# 提取内容（路径A：标准生成）
从这段文本里提取所有 URL：...

# 模糊需求（路径C：需追问）
帮我写个正则校验用户输入
```

## 参考资料

- 常用模式速查: [references/cheat-sheet.md](references/cheat-sheet.md)

