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

I have a string

str := "IGotInternAtGeeksForGeeks"

I try to convert it in to

str = "i_got_intern_at_geeks_for_geeks"

Try this,

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:

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

Output:

i_got_intern_at_geeks_for_geeks

NOTE : this will not work for many non-English languages

Faster and simpler version:

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()
}

Known bugs: 1. no-ascii 2. reversed upper abbreviate word, eg. baseURL will be ugly base_u_r_l, but not base_url, consider use white list to filter.