Golang regexp.ReplaceAllString 忽略替换字符串“$X_”

use*_*859 3 go

我正在尝试使用我在此处找到的正则表达式将 CamelCase 转换为 Snake_case 。这是我正在使用的代码片段:

in := "camelCase"
var re1 = regexp.MustCompile(`(.)([A-Z][a-z]+)`)
out := re1.ReplaceAllString(in, "$1_$2")
Run Code Online (Sandbox Code Playgroud)

正则表达式将匹配lCase. $1这里 isl$2is Case,所以使用替换字符串"$1_$2"应该会导致camel_Case. 相反,它会导致cameCase.

将替换字符串更改为"$1_"结果came。如果我将其更改为"$1+$2",结果将camel+Case如预期(请参阅游乐场)。

现在,我的解决方法是用作"$1+$2"替换字符串,然后使用strings.Replace将加号更改为下划线。这是一个错误还是我在这里做错了什么?

use*_*559 5

解决方法是使用${1}_$2(或${1}_${2}对称)。

根据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"