替换里的大小写魔法:用 \U \L \u \l 一键在 snake_case / camelCase / PascalCase / CONSTANT 之间互转

· 约 3 分钟 🔍 Regex Pro

“怎么用正则替换时把捕获组转成大写?” 标准答案一向是:“不行,得写回调函数。” 因为 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>\EerrorERROR

一个绕不过的坑:这套语法不进代码

这是全篇最关键的提醒:

\U \L \u \lsed / Perl / regex101 / Regex Pro 替换面板的约定,JavaScript String.replace、Python re.sub、Java replaceAll 都不认识它。把 \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 就是个省事的利器,而不是一个会让你导出后翻车的陷阱。

❓ 常见问题

标准正则替换不是不能改大小写吗?Regex Pro 怎么做到的?

标准 JS String.prototype.replace 的字符串模板确实改不了大小写——它只有 $1 $& $<name> 这类占位符,想把捕获组转大写只能传回调函数 (m, g) => g.toUpperCase()。这也是网上"命名风格转换必须写回调"说法的由来。但 Regex Pro 的替换面板额外实现了 sed / Perl / regex101 风格的大小写修饰符:(1) \U…\E —— 把这之间展开的内容全转大写;(2) \L…\E —— 全转小写;(3) \u —— 只把紧跟其后那一段的首字符转大写;(4) \l —— 首字符转小写;外加 \n \t \r \\ 转义。所以在工具里,把 snake 的 _([a-z]) 替换成 \u$1 就能把下划线后那个字母变大写,无需任何回调——这是工具替换面板独有的便利。但这套语法不是 JS 原生的,导出到代码要小心(见最后一条)。

snake_case 转 camelCase / PascalCase 的替换模板具体怎么写?

camelCase(首单词小写):Pattern _([a-z])Replace \u$1Flags g——把每个"下划线+小写字母"换成该字母的大写,下划线消失。user_profile_iduserProfileIdPascalCase(每个单词首字母都大写,含第一个):先用上面那条转成 camelCase,再补一步把整体首字母大写——Pattern ^([a-z])、Replace \u$1;或一条到位用 Pattern (?:^|_)([a-z])、Replace \u$1、Flags g(?:^|_) 让"开头"和"下划线后"都命中),user_profile_idUserProfileId反向 camel/Pascal 转 snake:Pattern ([a-z0-9])([A-Z])、Replace $1_\l$2、Flags g,把"小写后跟大写"处插下划线并把大写转小写,userProfileIduser_profile_id(Pascal 还需再把开头那个 \l 处理一下)。每条都能在替换面板即时预览前若干条命中,调对了再用。

转成 CONSTANT_CASE(全大写下划线)和 kebab-case 呢?

CONSTANT_CASE:若源是 snake_case,直接 Pattern .+(或不替换、用 \U 包整段)其实最简单的是 Pattern (\w+)、Replace \U$1\E、Flags g——把每段单词整体转大写,max_retry_countMAX_RETRY_COUNT。若源是 camelCase,先按上一条转 snake,再 \U 整体转大写。kebab-case(短横线小写):从 camelCase 来,Pattern ([a-z0-9])([A-Z])、Replace $1-\l$2、Flags g(和转 snake 一样,只是分隔符换成 -),backgroundColorbackground-color;从 snake 来更简单,Pattern _、Replace - 即可。组合技:\L 整段转小写 + 分隔符替换能覆盖大多数场景。建议在替换面板里一步步试,每改一处看预览,比一次写复杂模板更稳。

\u 只改一个字符,我想把整个单词转大写但保留下划线分隔怎么办?

分清 \u/\l(只管下一个字符)\U…\E /\L…\E(管一个区间直到 \E)。想把"某个捕获组整体"转大写,用 \U$1\E 而不是 \u$1——后者只大写首字母。例:把日志级别统一成大写 (?<lvl>error|warn|info)\U$<lvl>\EerrorERROR保留分隔符的整词大写:Pattern ([a-z]+) 、Replace \U$1\E、Flags g,只对字母段转大写、下划线/连字符等非字母原样保留,api_base_urlAPI_BASE_URL首字母大写其余不动(Title Case 单词)\b([a-z])\u$1、Flags ghello worldHello World记住边界:\E 之后修饰符失效,没写 \E 的话 \U 会一直作用到模板末尾——长模板里务必成对写 \U…\E、\L…\E,别漏 \E。

在工具里调好的大小写替换,复制到 JS / Python 代码里能直接用吗?

不能直接用——这是最关键的坑。 \U \L \u \l 是 sed / Perl / regex101 / Regex Pro 替换面板的约定,JavaScript 原生 String.replace、Python re.sub、Java replaceAll 都不认识这套,你把 \u$1 当替换字符串传给原生 API,\u 会被当成别的东西(甚至 Unicode 转义)而不是"首字母大写"。而且状态栏的 ⎘ JS / ⎘ Py / ⎘ Java 按钮复制的是 pattern(正则本身),不含替换模板——所以大小写转换逻辑不会被一起导出。正确做法:在 Regex Pro 里用 \U/\u 快速把转换效果调对、确认 pattern 抓的位置没错 → 复制 pattern 到代码 → 在代码里用回调函数实现大小写:JS str.replace(/_([a-z])/g, (_, c) => c.toUpperCase())、Python re.sub(r"_([a-z])", lambda m: m.group(1).upper(), s)一句话定位:Regex Pro 的大小写替换是"工具内一次性转换"的利器(清单、配置、SQL 字段名批量改风格),要进代码就把它当"验证 pattern 和效果"的草稿,转换本身用回调落地。

🔍 打开 Regex Pro 对标 regex101·pattern 语法着色·AST 中文解释·命名组捕获/回引·替换预览·大文本 grep 模式·Web Worker 超时保护·本地运行

📖 同一工具的其他教程