Как преобразовать строку с верблюжьим корпусом в чехол со змеей - PullRequest
2 голосов
/ 16 июня 2019

У меня есть строка

str := "IGotInternAtGeeksForGeeks"

Я пытаюсь преобразовать ее в

str = "i_got_intern_at_geeks_for_geeks"

Ответы [ 2 ]

6 голосов
/ 16 июня 2019

Попробуйте,

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

ПРИМЕЧАНИЕ: это не будет работать для многихАнглийский языки

0 голосов
/ 17 июня 2019

Более быстрая и простая версия:

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. no-ascii 2. перевернутое слово верхней аббревиатуры, например.baseURL будет безобразным base_u_r_l, но не base_url, рассмотрите возможность использования белого списка для фильтрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...