我试图使用我找到的here正则表达式将CamelCase转换为snake_case。这是我使用的代码片段:
in := "camelCase"
var re1 = regexp.MustCompile(`(.)([A-Z][a-z]+)`)
out := re1.ReplaceAllString(in, "$1_$2")
正则表达式将匹配lCase
。 $1
此处为l
,$2
为Case
,因此使用替换字符串"$1_$2"
应生成camel_Case
。相反,它会产生cameCase
。
将替换字符串更改为"$1_"
会产生came
。如果我将其更改为"$1+$2"
,则结果将为camel+Case
,符合预期(see playground)。
现在,我的解决方法是使用"$1+$2"
作为替换字符串,然后使用strings.Replace
将加号更改为下划线。这是一个错误还是我在这里做错了什么?
答案 0 :(得分:2)
修复方法是使用${1}_$2
(或${1}_${2}
进行对称)。
Per https://golang.org/pkg/regexp/#Regexp.Expand(我的重点):
在模板中,变量由表单的子字符串表示 $ name或$ {name},其中name是非空字母序列, 数字,和下划线。
...
在$ name表单中,将使用名称 尽可能长:$ 1x相当于$ {1x},而不是$ {1} x,并且, 10美元相当于$ {10},而不是$ {1} 0。
因此,在$1_$2
中,您实际上正在寻找名为1_
的群组,然后寻找另一个名为2
的群组并将它们组合在一起。
至于为什么使用$1_$2
(或$foo$2
来解决这个问题)导致“cameCase”,同样的文档说:
对超出范围或不匹配的索引或名称的引用 正则表达式中不存在的内容将替换为空切片。
因此,替换为"$1_$2"
相当于仅使用"$2"
替换。