我有一个字符串
str := "IGotInternAtGeeksForGeeks"
我尝试将其转换为
str = "i_got_intern_at_geeks_for_geeks"
答案 0 :(得分: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)
}
运行:
func main() {
fmt.Println(ToSnakeCase("IGotInternAtGeeksForGeeks"))
}
输出:
i_got_intern_at_geeks_for_geeks
注意:这不适用于许多非英语语言
答案 1 :(得分:1)
没有正则表达式版本。
仅字母,因为用例是结构字段 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)
}
}
答案 2 :(得分:0)
更快更简单的版本:
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.无关联
2.反向上缩写词,例如。 baseURL会很丑base_u_r_l
,而不是base_url
,请考虑使用白名单进行过滤。
答案 3 :(得分:0)
我知道这是旧文章,但是,我创建了一个名为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
}