【问题标题】:Golang regexp.ReplaceAllString ignores the replacement string "$X_"Golang regexp.ReplaceAllString 忽略替换字符串“$X_”
【发布时间】:2016-07-20 05:18:00
【问题描述】:

我正在尝试使用我找到的正则表达式 here 将 CamelCase 转换为 snake_case。这是我正在使用的代码的 sn-p:

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 将加号更改为下划线。这是一个错误还是我在这里做错了什么?

【问题讨论】:

    标签: go


    【解决方案1】:

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

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

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

    ...

    在 $name 形式中,name 被带到 尽可能长:$1x 等价于 ${1x},而不是 ${1}x,并且, $10 等价于 ${10},而不是 ${1}0。

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

    至于为什么使用$1_$2(或$foo$2)会导致“cameCase”,同样的文档说:

    对超出范围或不匹配索引或名称的引用 正则表达式中不存在的将替换为空切片。

    所以替换为"$1_$2" 等同于仅替换为"$2"

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 1970-01-01
      • 2019-06-30
      • 2012-08-08
      • 2017-10-23
      • 1970-01-01
      • 2012-07-14
      • 2019-03-21
      • 1970-01-01
      相关资源
      最近更新 更多