【问题标题】:How to convert Camel case string to snake case如何将骆驼案例字符串转换为蛇案例
【发布时间】:2019-10-30 03:43:27
【问题描述】:

我有一个字符串

str := "IGotInternAtGeeksForGeeks"

我尝试将其转换为

str = "i_got_intern_at_geeks_for_geeks"

【问题讨论】:

  • 尽管有答案,但我们不是来为您工作的。你必须展示你的尝试。
  • 好的@flimzy...我正在尝试将这样的骆驼字符串转换为蛇...。它的工作。不过谢谢你的指点。
  • 我知道你想做什么。你在你的问题中这么说。我的观点是,问题应尽最大努力,包括代码。
  • 好问题 +1。首选的 Go 术语是 MixedCaps 或 mixedCaps 而不是 CamelCase。见golang.org/doc/effective_go.html#mixed-caps

标签: string go


【解决方案1】:

试试这个,

import (
    "fmt"
    "strings"
    "regexp"
)

var matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)")
var matchAllCap   = regexp.MustCompile("([a-z0-9])([A-Z])")

func ToSnakeCase(str string) string {
    snake := matchFirstCap.ReplaceAllString(str, "${1}_${2}")
    snake  = matchAllCap.ReplaceAllString(snake, "${1}_${2}")
    return strings.ToLower(snake)
}

运行:

func main() {   
    fmt.Println(ToSnakeCase("IGotInternAtGeeksForGeeks"))
}

输出:

i_got_intern_at_geeks_for_geeks

注意:这不适用于许多非英语语言。

【讨论】:

  • 你知道第一个大写字母与其他字母不同的原因吗?
【解决方案2】:

我知道这是旧帖子,但我创建了一个名为 gobeam/Stringy 的包,您可以轻松地将骆驼大小写字符串转换为蛇大小写和烤肉大小写,反之亦然。示例:

package main

import (
    "fmt"
    stringy "github.com/gobeam/Stringy"
)

func main() {
    str := stringy.New("HelloGuysHowAreYou?")
    snakeStr := str.SnakeCase("?", "")
    fmt.Println(snakeStr.ToLower()) // hello_guys_how_are_you
    fmt.Println(snakeStr.ToUpper()) // HELLO_GUYS_HOW_ARE_YOU
}

【讨论】:

    【解决方案3】:

    无正则表达式版本。

    只有字母,因为用例是 struct field db tag。随意修改它以用于其他用例。

    func ToSnake(camel string) (snake string) {
        var b strings.Builder
        diff := 'a' - 'A'
        l := len(camel)
        for i, v := range camel {
            // A is 65, a is 97
            if v >= 'a' {
                b.WriteRune(v)
                continue
            }
            // v is capital letter here
            // irregard first letter
            // add underscore if last letter is capital letter
            // add underscore when previous letter is lowercase
            // add underscore when next letter is lowercase
            if (i != 0 || i == l-1) && ( // head and tail
                (i > 0 && rune(camel[i-1]) >= 'a') || // pre
                    (i < l-1 && rune(camel[i+1]) >= 'a')) { //next
                b.WriteRune('_')
            }
            b.WriteRune(v + diff)
        }
        return b.String()
    }
    
    // here is the test
    func TestToSnake(t *testing.T) {
        input := "MyLIFEIsAwesomE"
        want := "my_life_is_awesom_e"
        if got := ToSnake(input); got != want {
            t.Errorf("ToSnake(%v) = %v, want %v", input, got, want)
        }
    }
    

    【讨论】:

      【解决方案4】:

      更快更简单的版本:

      import "bytes"
      
      func SnakeCase(camel string) string {
          var buf bytes.Buffer
          for _, c := range camel {
              if 'A' <= c && c <= 'Z' {
                  // just convert [A-Z] to _[a-z]
                  if buf.Len() > 0 {
                      buf.WriteRune('_')
                  }
                  bytes.WriteRune(c - 'A' + 'a')
              } else {
                  bytes.WriteRune(c)
              }
          }
          return buf.String()
      }
      

      已知错误: 1.无ASCII 2.颠倒的大写缩写词,例如。 baseURL 会丑陋base_u_r_l,而不是base_url,考虑使用白名单过滤。

      【讨论】:

        【解决方案5】:

        包装成一个包

        import (
            "fmt"
            "github.com/buxizhizhoum/inflection"
        )
        
        func example () {
            // to convert a string to underscore
            res := inflection.Underscore("aA")
            // will return a_a
            fmt.Println(res)
            // to convert a string to camelize
            // will return AA
            fmt.Println(inflection.Camelize("a_a", true))
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-06-11
          • 2019-05-15
          • 2020-05-03
          • 2020-02-10
          • 1970-01-01
          • 2016-01-16
          • 1970-01-01
          相关资源
          最近更新 更多