如何用PowerShell正则替换将驼峰命名转为下划线分隔?
问题需求
需要用PowerShell正则替换命令,将驼峰命名的字符串:
RedHerringFallacy SunkenCostFallacy FalseDilemmaLogic AnyOtherCamelCapString
转换为下划线分隔的命名格式:
Red_Herring_Fallacy Sunken_Cost_Fallacy False_Dilemma_Logic Any_Other_Camel_Cap_String
失败的尝试及结果
1) 后向查找法
$string = "FundRegions" $modifiedString = $string -replace '(?<=[a-z])(?=[A-Z])', '_' $modifiedString
结果:F_u_n_d_R_e_g_i_o_n_s
2) 基础替换法
$string = "FundRegions" $modifiedString = $string -replace '([a-z])([A-Z])', '$1_$2' $modifiedString
结果:F_un_dR_eg_io_ns
3) 反引号转义尝试
$string = "FundRegions" $modifiedString = $string -replace '([a-z])([A-Z])', '`$1_`$2' $modifiedString
结果:F_un_dR_eg_io_ns
4) 逐字符遍历法
$string = "FundRegions" function InsertUnderscores([string]$str) { $result = "" for ($i = 0; $i -lt $str.Length; $i++) { $result += $str[$i] if ($i -lt $str.Length - 1 -and $str[$i] -match '[a-z]' -and $str[$i+1] -match '[A-Z]') { $result += '_' } } return $result } $modifiedString = InsertUnderscores $string $modifiedString
结果:F_u_n_d_R_e_g_i_o_n_s
正确解决方案
核心原因
所有尝试失败的根源是PowerShell的-replace运算符默认不区分大小写,导致正则中的[a-z]和[A-Z]匹配范围混乱,错误插入下划线。
实现方法
使用PowerShell的区分大小写替换运算符-creplace,结合正则即可完成转换:
方法1:零宽断言替换
# 处理单个字符串 $string = "RedHerringFallacy" $modifiedString = $string -creplace '(?<=[a-z])(?=[A-Z])', '_' $modifiedString # 输出:Red_Herring_Fallacy # 批量处理多行字符串 $camelCaseList = @" RedHerringFallacy SunkenCostFallacy FalseDilemmaLogic AnyOtherCamelCapString "@ -split "`n" $snakeCaseList = $camelCaseList | ForEach-Object { $_ -creplace '(?<=[a-z])(?=[A-Z])', '_' } $snakeCaseList
输出:
Red_Herring_Fallacy Sunken_Cost_Fallacy False_Dilemma_Logic Any_Other_Camel_Cap_String
方法2:捕获组替换
$string = "SunkenCostFallacy" $modifiedString = $string -creplace '([a-z])([A-Z])', '$1_$2' $modifiedString # 输出:Sunken_Cost_Fallacy
说明
-creplace:强制区分大小写,确保[a-z]仅匹配小写字母,[A-Z]仅匹配大写字母。- 零宽断言
(?<=[a-z])(?=[A-Z]):匹配小写字母与大写字母之间的空位置,插入下划线且不修改原有字符。 - 捕获组
([a-z])([A-Z]):捕获小写字母后跟大写字母的组合,替换为小写字母_大写字母,实现格式转换。
内容的提问来源于stack exchange,提问作者Jerome B
相关产品推荐
相关产品推荐

