[Kotlin] 컬렉션(List, Set등)으로 문자열 Split하기

코틀린 내장 Split 라이브러리는 여러개의 구분자를 지원하긴 하지만, 구분자가 계속 가변적으로 바뀌어 곤란한 경우에 다음과 같은 코드를 사용하면 됩니다.

Split (collection 사용)

컬렉션 타입으로 저장된 여러 구분자를 이용해 문자열을 자르는 확장함수를 구현하였다.

CharString 타입의 구분자들을 포함하는 컬렉션을 이용해 분할이 가능하다.

fun main() {
    // splitByCollection
    println("한놈,두식이0석삼^너구리".splitByCollection(setOf(",", '0', "^")))
    // [한놈, 두식이, 석삼, 너구리]
    println("하나:둘,셋;넷".splitByCollection(listOf(":", ",", ';')))
    // [하나, 둘, 셋, 넷]
}

// 컬렉션 타입으로 저장된 구분자를 이용해 String 분할하는 확장함수
fun <T> String.splitByCollection(delimiters: Collection<T>): List<String> {
    // 구분자들을 이스케이프 처리하고 정규식 OR(|)로 결합
    val escapedDelimiters = delimiters.map {
        when (it) {
            is Char -> Regex.escape(it.toString())
            is String -> Regex.escape(it)
            else -> throw IllegalArgumentException("지원하지 않는 구분자 타입 입니다.")
        }
    }
    val regex = escapedDelimiters.joinToString("|").toRegex()
    // 정규식을 사용해 문자열을 분할
    return this.split(regex)
}

컬렉션을 인자로 받으면 좋은 사례

  • 구분자를 동적으로 추가하거나 제거해야 할 때
  • 구분자의 개수가 가변적일 때
  • 구분자를 외부에서 입력받아야 할 때
  • CharString 의 구분자가 혼합되어 있을 때