Cases.kt
package com.hexagonkt.core.text
val CAMEL_CASE: Regex by lazy { Regex("[a-z]+([A-Z][a-z0-9]+)+") }
val PASCAL_CASE: Regex by lazy { Regex("([A-Z][a-z0-9]+)+") }
val SNAKE_CASE: Regex by lazy { Regex("[_A-Za-z]+[_A-Za-z0-9]*") }
val KEBAB_CASE: Regex by lazy { Regex("[\\-A-Za-z]+[\\-A-Za-z0-9]*") }
fun String.camelToWords(): List<String> =
split("(?=\\p{Upper}\\p{Lower})".toRegex()).toWords()
fun String.snakeToWords(): List<String> =
split("_").toWords()
fun String.kebabToWords(): List<String> =
split("-").toWords()
fun List<String>.toWords(): List<String> =
filter(String::isNotEmpty).map(String::lowercase)
fun List<String>.wordsToCamel(): String =
wordsToPascal().replaceFirstChar(Char::lowercase)
fun List<String>.wordsToPascal(): String =
joinToString("") { it.replaceFirstChar(Char::uppercase) }
fun List<String>.wordsToSnake(): String =
joinToString("_")
fun List<String>.wordsToKebab(): String =
joinToString("-")
fun List<String>.wordsToTitle(): String =
joinToString(" ") { it.replaceFirstChar(Char::uppercase) }
fun List<String>.wordsToSentence(): String =
joinToString(" ").replaceFirstChar(Char::uppercase)
/**
* Transform the target string from snake case to camel case.
*/
fun String.snakeToCamel(): String =
snakeToWords().wordsToCamel()
fun Enum<*>.toWords(): String =
toString().lowercase().replace("_", " ")
/**
* Transform the target string from camel case to snake case.
*/
fun String.camelToSnake(): String =
camelToWords().wordsToSnake()