我该如何将骆驼箱字符串转换为蛇形箱并转换回惯用的Kotlin?

时间:2020-01-31 19:43:56

标签: string kotlin snakecasing

寻找将进行如下转换的代码: “ MyCamelCaseA”到“ my_camel_case_a” 从“ AMultiWordString”到“ a_multi_word_string” “ my_camel_case_a”到“ myCamelCaseA”或“ MyCamelCaseA” 从“ a_multi_word_string”到“ aMultiWordString”或“ AMultiWordString”

6 个答案:

答案 0 :(得分:10)

这是String类的扩展,使用正则表达式和替换内容将字符串从驼峰式大写转换为蛇形,从蛇形大写转换为驼峰式:

val camelRegex = "(?<=[a-zA-Z])[A-Z]".toRegex()
val snakeRegex = "_[a-zA-Z]".toRegex()

// String extensions
fun String.camelToSnakeCase(): String {
    return camelRegex.replace(this) {
        "_${it.value}"
    }.toLowerCase()
}

fun String.snakeToLowerCamelCase(): String {
    return snakeRegex.replace(this) {
        it.value.replace("_","")
            .toUpperCase()
    }
}

fun String.snakeToUpperCamelCase(): String {
    return this.snakeToLowerCamelCase().capitalize()
}

以下是使用String扩展名的示例:

print("${"MyCamelCaseA".camelToSnakeCase()}\n")
my_camel_case_a
print("${"AMultiWordString".camelToSnakeCase()}\n")
a_multi_word_string
"my_camel_case_a".snakeToLowerCamelCase()
myCamelCaseA
"my_camel_case_a".snakeToUpperCamelCase()
MyCamelCaseA

答案 1 :(得分:4)

这是我的目标。

fun String.camelToSnakeCase() = fold(StringBuilder(length)) { acc, c ->
    if (c in 'A'..'Z') (if (acc.isNotEmpty()) acc.append('_') else acc).append(c + ('a' - 'A'))
    else acc.append(c)
}.toString()

我的方法也是以扩展函数的形式编写的,但是它不使用正则表达式,而是逐个字符地处理,处理它们并将处理结果折叠到累加器中,该累加器在开始时是一个空{ {1}}。处理如下:

  • 如果该字符不是大写拉丁字母,则按原样将其添加到累加器中
  • 如果字符是大写拉丁字母,则还要检查它是否不是字符串的第一个字符(累加器不为空)。如果不是,则将下划线添加到累加器。最后添加小写字母。

要注意的一件事是使用了StringBuilder,而不是JDK。

答案 2 :(得分:2)

我会采用这些实现:

fun String.toCamelCase() = 
    split('_').joinToString("", transform = String::capitalize)

... 使用蛇作为分隔符分割字符串,然后将部分重新附加为没有分隔符的大写单词。

fun String.toSnakeCase() = replace(humps, "_").toLowerCase()
private val humps = "(?<=.)(?=\\p{Upper})".toRegex()

... 它使用正则表达式查找驼峰之前的位置,插入蛇,然后将整个字符串转换为小写。正则表达式由两部分组成,第一个 (?<=.) 是正向后视,表示它必须以字符开头,第二部分 (?=\\p{Upper}) 使用正向后视,表示它必须后跟一个大写字符。

答案 3 :(得分:0)

这仅是我对kotlin的尝试

   val  camelCaseString = "thisIsCamelCase"
    val snakeCaseString = camelCaseString.map {
        if (it.isUpperCase()){
            "_${it.toLowerCase()}"
        }else
{"$it"}
    }
.joinToString(separator = "")
System.out.println("here is your snake string: $snake_case_string")

这是你的蛇串:this_is_camel_case

从蛇转换为骆驼

val snakeCaseString = "snake_case_string"
val camelCase = StringBuilder()
var prevChar = '$'
snakeCaseString.forEach {
if(prevChar.equals('_')){
    camelCase.append(it.toUpperCase())
}else if(!it.equals('_')){
    camelCase.append(it)
}
    prevChar = it
}

System.out.println(camelCase.toString())

snakeCaseString

答案 4 :(得分:0)

如果您想要一个带有输入和输出的方法,这就是我的方法:

private fun convertCamelToSnakeCase(camelCase : String) : String {
    val snakeCase = StringBuilder()
    for(character in camelCase) {
        if(character.isUpperCase()) {
            snakeCase.append("_${character.toLowerCase()}")
        } else {
            snakeCase.append(character)
        }
    }
    return snakeCase.removePrefix("_").toString()
}

答案 5 :(得分:0)

我在这里接受了其中一个答案,添加了标题案例并稍微更改了 API

val camelRegex = "(?<=[a-zA-Z])[A-Z]".toRegex()
val snakeRegex = "_[a-zA-Z]".toRegex()

@JvmInline
value class SnakeCaseString(private val string: String) {
    fun toCamelCase(): String = snakeRegex.replace(string) { it.value.replace("_", "").uppercase() }
    fun toUpperCamelCase(): String =
        toCamelCase().replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
    fun toTitleCase(): String = snakeRegex.replace(string) { it.value.replace("_", " ").uppercase() }
        .replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
}

@JvmInline
value class CamelCaseString(private val string: String) {
    fun toSnakeCase(): String = camelRegex.replace(string) { "_${it.value}" }.lowercase()
    fun toTitleCase(): String = camelRegex.replace(string) { "_${it.value}" }
        .replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
}

fun String.asSnakeCase() = SnakeCaseString(this)
fun String.asCamelCase() = CamelCaseString(this)