Skip to content

Instantly share code, notes, and snippets.

@petitviolet
Created February 7, 2018 09:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save petitviolet/6efd010e8838123d1492c9bb2c6a541e to your computer and use it in GitHub Desktop.
Save petitviolet/6efd010e8838123d1492c9bb2c6a541e to your computer and use it in GitHub Desktop.
String converter for camelCase <-> snake_case
object StringFormatter {
private val spacesPattern = "[-\\s]".r
private val firstPattern = "([A-Z]+)([A-Z][a-z])".r
private val secondPattern = "([a-z\\d])([A-Z])".r
private val replacementPattern = "$1_$2"
implicit class stringFormatter(val word: String) extends AnyVal {
def snakenize: String = {
spacesPattern
.replaceAllIn(secondPattern.replaceAllIn(
firstPattern.replaceAllIn(word, replacementPattern),
replacementPattern
),
"_")
.toLowerCase
}
def camelize: String = {
@scala.annotation.tailrec
def loop(left: List[Char] = Nil, right: List[Char] = word.toList): List[Char] =
right match {
case '_' :: c :: rest => loop(c.toUpper :: left, rest)
case '_' :: Nil => left
case c :: rest => loop(c :: left, rest)
case Nil => left
}
loop().reverse.mkString
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment