我有一串
str := "IGotInternAtGeeksForGeeks"
Run Code Online (Sandbox Code Playgroud)
我尝试将其转换为
str = "i_got_intern_at_geeks_for_geeks"
尝试这个,
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)
注意:这不适用于许多非英语语言
小智 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)
没有正则表达式版本。
仅字母,因为用例是结构字段 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)