Golang regexp.ReplaceAllString忽略替换字符串" $ X _"

时间:2016-07-20 05:18:00

标签: go

我试图使用我找到的here正则表达式将CamelCase转换为snake_case。这是我使用的代码片段:

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

正则表达式将匹配lCase$1此处为l$2Case,因此使用替换字符串"$1_$2"应生成camel_Case。相反,它会产生cameCase

将替换字符串更改为"$1_"会产生came。如果我将其更改为"$1+$2",则结果将为camel+Case,符合预期(see playground)。

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

1 个答案:

答案 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"替换。