“怎么用正则替换时把捕获组转成大写?” 标准答案一向是:“不行,得写回调函数。” 因为 JavaScript 的 String.prototype.replace 字符串模板只有 $1 $& $<name> 这些占位符,没有大小写变换能力。
但如果你只是想一次性把一批字段名从 snake_case 改成 camelCase、或把一列常量名全大写,开个编辑器写回调函数太重了。Regex Pro 的替换面板补上了这块——它实现了 sed / Perl / regex101 风格的大小写修饰符,让你在替换框里直接转大小写。
四个修饰符
替换面板在标准占位符之外,额外支持:
| 修饰符 | 作用 | 例(Replace 模板) |
|---|---|---|
\U…\E | 区间内全转大写,直到 \E | \U$1\E → 整组大写 |
\L…\E | 区间内全转小写,直到 \E | \L$1\E → 整组小写 |
\u | 紧跟其后首字符转大写 | \u$1 → 组的首字母大写 |
\l | 紧跟其后首字符转小写 | \l$2 → 组的首字母小写 |
外加 \n \t \r \\ 转义。关键区别:\u/\l 只管一个字符,\U/\L 管一整段——长模板里 \U…\E、\L…\E 务必成对写,漏掉 \E 会让大写一直作用到模板末尾。
命名风格互转模板大全
每条都能在替换面板即时预览,g 标志记得勾上。
snake_case → camelCase
Pattern: _([a-z])
Replace: \u$1
→ user_profile_id → userProfileId
snake_case → PascalCase(开头和下划线后都大写)
Pattern: (?:^|_)([a-z])
Replace: \u$1
→ user_profile_id → UserProfileId
camelCase / PascalCase → snake_case
Pattern: ([a-z0-9])([A-Z])
Replace: $1_\l$2
→ userProfileId → user_profile_id
→ CONSTANT_CASE(snake 源最简单)
Pattern: ([a-z]+)
Replace: \U$1\E
→ api_base_url → API_BASE_URL (下划线等非字母原样保留)
camelCase → kebab-case
Pattern: ([a-z0-9])([A-Z])
Replace: $1-\l$2
→ backgroundColor → background-color
Title Case(每词首字母大写)
Pattern: \b([a-z])
Replace: \u$1
→ hello world → Hello World
整词大写但保留分隔符——用 \U$1\E 只圈字母段;统一日志级别 (?<lvl>error|warn|info) → \U$<lvl>\E 把 error 变 ERROR。
一个绕不过的坑:这套语法不进代码
这是全篇最关键的提醒:
\U \L \u \l是 sed / Perl / regex101 / Regex Pro 替换面板的约定,JavaScriptString.replace、Pythonre.sub、JavareplaceAll都不认识它。把\u$1当替换字符串传给原生 API,\u会被错误解释(甚至当成 Unicode 转义),绝不会产出”首字母大写”。
而且——状态栏的 ⎘ JS / ⎘ Py / ⎘ Java 按钮复制的是 pattern(正则本身),不含替换模板,所以大小写逻辑根本不会被一起导出。
正确分工:
// 在 Regex Pro 里用 \u$1 把效果调对、确认 pattern 抓的位置没错,
// 然后复制 pattern,在代码里用回调实现大小写:
str.replace(/_([a-z])/g, (_, c) => c.toUpperCase()); // JS
re.sub(r"_([a-z])", lambda m: m.group(1).upper(), s) # Python
怎么用最划算
- 一次性批量改风格(清单里的字段名、配置项、SQL 列名、常量表)——直接在替换面板用
\U/\u,调好点「复制结果」或「下载结果」拿走,这是它最爽的场景。 - 要写进代码 / 复用的转换逻辑——把 Regex Pro 当”验证 pattern 和转换效果”的草稿台:在这里把位置和效果调对,复制 pattern,回代码里用回调函数落地。
把”工具内快速转换”和”代码里规范实现”分清楚,\U \L \u \l 就是个省事的利器,而不是一个会让你导出后翻车的陷阱。