2016-07-20 76 views
1

我试图将CamelCase转换为使用正则表达式的snake_case,我发现here。下面是我使用的代码片段:

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+Casesee playground)。

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

回答

2

修复方法是使用${1}_$2(或${1}_${2}用于对称)。

https://golang.org/pkg/regexp/#Regexp.Expand(我的重点):

在模板中,一个变量由形式 $名称的子字符串或$ {名称},其中名称是字母一个非空序列记, 数字,和下划线

...

在$名称形式,名称取为 是尽可能长:$ 1X相当于$ {1X},而不是$ {1} x和, $ 10是相当于$ {10},而不是$ {1} 0。

所以在$1_$2,你实际上是在寻找一个名为1_组,然后命名2另一组,并把它们放在一起。

至于为何使用$1_$2(或$foo$2为此事)的结果“cameCase,”同样的文件说:

的引用超出范围或不匹配的指数或者说是 不是一个名字存在于正则表达式中的内容被替换为空片段。

因此,替换为"$1_$2"相当于用"$2"替换。