У меня есть строка, как
var str = "AbCdEfGhIj"
что я хочу переключить регистр каждого символа, то есть
преобразовать его в var str = "aBcDeFgHiJ"
в настоящее время я использую этот код ниже
val bytes = "HEllo WoRLd".toByteArray()
// Swap upper and lower case letters.
for (i in bytes.indices) {
if (bytes[i] >= 'A'.toByte() && bytes[i] <= 'Z'.toByte())
bytes[i] = ('a'.toInt() + (bytes[i] - 'A'.toByte())).toByte()
else if (bytes[i] >= 'a'.toByte() && bytes[i] <= 'z'.toByte())
bytes[i] = ('A'.toInt() + (bytes[i] - 'a'.toByte())).toByte()
}
System.out.print(String(bytes)) // heLLO wOrlD
Интересно, есть ли регулярное выражение, которое может это сделать
… К тому же, это уже выглядит нормально. Я бы предпочел немного оптимизировать читаемость кода, но в целом все в порядке.
Я имею в виду, что это выполнимо. Но это излишне усложнит его и повлияет на производительность.
Как говорится в комментариях, регулярные выражения предназначены для сопоставления, а не для изменения.
Но код в вопросе можно улучшить; он не будет работать для символов, отличных от ASCII (и излишне сложен). Вот более элегантная версия в качестве функции расширения String
:
fun String.swapCase() = map {
when {
it.isUpperCase() -> it.toLowerCase()
it.isLowerCase() -> it.toUpperCase()
else -> it
}
}.joinToString("")
println("HEllo WoRLd".swapCase()) // heLLO wOrlD
Regex используется для сопоставления с образцом. Я не думаю, что его можно использовать для переключения корпуса.