寻找将进行如下转换的代码: “ MyCamelCaseA”到“ my_camel_case_a” 从“ AMultiWordString”到“ a_multi_word_string” “ my_camel_case_a”到“ myCamelCaseA”或“ MyCamelCaseA” 从“ a_multi_word_string”到“ aMultiWordString”或“ AMultiWordString”
答案 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)