如何将骆驼的情况下字符串转换为蛇案

Ans*_*shu -1 string go

我有一串

str := "IGotInternAtGeeksForGeeks"
Run Code Online (Sandbox Code Playgroud)

我尝试将其转换为

str = "i_got_intern_at_geeks_for_geeks"

Ten*_*uge 6

尝试这个,

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)
}
Run Code Online (Sandbox Code Playgroud)

跑:

func main() {   
    fmt.Println(ToSnakeCase("IGotInternAtGeeksForGeeks"))
}
Run Code Online (Sandbox Code Playgroud)

输出:

i_got_intern_at_geeks_for_geeks
Run Code Online (Sandbox Code Playgroud)

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

  • 您是否知道第一个大写字母与其他大写字母的处理方式不同的原因? (2认同)

小智 5

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

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
}

Run Code Online (Sandbox Code Playgroud)


Ale*_*ent 5

没有正则表达式版本。

仅字母,因为用例是结构字段 db 标记。请随意修改它以适应其他用例。

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)
    }
}
Run Code Online (Sandbox Code Playgroud)