[Kotlin in Action] 11. 문자열과 정규식 (split 메서드, 정규식, 3중 따옴표)

반응형
728x90
반응형

코틀린 문자열 (String)

코틀린 문자열은 자바 문자열과 같다. 코틀린 코드가 만들어낸 문자열을 아무 자바 메서드에 넘겨도 되며, 자바 코드에서 받은 문자열을 아무 코틀린 표준 라이브러리 함수에 전달해도 문제가 없다.

 

 

문자열 나누기

1) String의 split 메서드

자바에서 split 메서드를 보자.

"12.345-6.A".split(".")

위 코드의 결과는 [12, 345-6, A]가 아닌 빈 문자열이다.

자바의 split의 구분 문자열은 실제로 정규식이며, 마침표(.)는 모든 문자를 나타내는 정규식으로 해석된다.

 

코틀린에서는 split 확장 함수를 제공함으로써 혼동을 야기하는 메서드를 감춘다.

fun main() {
    println("12.345-6.A".split(".")) // [12, 345-6, A]

    // toRegex() : 문자열을 정규식으로 변환할 수 있는 확장 함수
    println("12.345-6.A".split("\\.|-".toRegex())) // [12, 345, 6, A]

    // 여러 구분 문자열을 지정한다.
    println("12.345-6.A".split(".", "-")) // [12, 345, 6, A]
}

정규식을 파라미터로 받는 함수는 String이 아닌 Regex 타입의 값을 받는다. 따라서 코틀린에서는 split 함수에 전달하는 값의 타입에 따라 정규식이나 일반 텍스트 중 어느것을 문자열을 분리하는지 쉽게 알 수 있다.

 

 

정규식

1) String을 확장한 함수를 사용

"/Users/westssun/kotlin-book/chapter.adoc"

- 디렉터리 : /Users/westssun/kotlin-book
- 마지막 슬래시 : /Users/westssun/kotlin-book '/'
- 파일 이름 : chapter
- 마지막 마침표 : chapter'.'
- 확장자 : adoc

 

예제
fun parsePath(path: String){
    val directory = path.substringBeforeLast("/")
    val fullName = path.substringAfterLast("/")
    val fileName = fullName.substringBeforeLast(".")
    val extension = fullName.substringAfterLast(".")

    println("Dir: $directory, fullName: $fullName, name: $fileName, ext: $extension")
}

fun main() {
    // Dir: /Users/westssun/kotlin-book, fullName: chapter.adoc, name: chapter, ext: adoc
    println(parsePath("/Users/westssun/kotlin-book/chapter.adoc"))
}

 

2) 정규식을 사용

/* 정규식 사용하기 */
fun parsePathRegex(path: String) {
    /*
    3중 따옴표 사용
    3중 따옴표 문자열에서는 어떤 문자도 이스케이프할 필요가 없다.
    예를들어, 일반 문자열을 사용해 정규식을 작성하는 경우 마침표 기호를 이스케이프하려면 \\.라고 써야하지만,
    3중 따옴표 문자열에서는 \.라고 쓰면 된다.

     */
    val regex = """(.+)/(.+)\.(.+)""".toRegex()
    val matchResult = regex.matchEntire(path)

    if (matchResult != null) {
        val (directory, filename, extension) = matchResult.destructured
        println("Dir: $directory, filename: $filename, ext: $extension")
    }
}

fun main() {
    // Dir: /Users/westssun/kotlin-book, filename: chapter, ext: adoc
    println(parsePathRegex("/Users/westssun/kotlin-book/chapter.adoc"))
}

 

 

 

3중 따옴표

3중 따옴표 문자열을 문자열 이스케이프를 피하기 위해서만 사용하지 않는다. 3중 따옴표 문자열에는 줄 바꿈을 표현하는 아무 문자열이나 그대로 들어간다. 따라서 3중 따옴표를 쓰면 줄 바꿈이 들어있는 프로그램 텍스트를 쉽게 문자열로 만들 수 있다.

fun main() {
    // 여러줄 문자열 = 3중 따옴표 문자열
    // 들여쓰기, 줄바꿈 등 포함한 모든 문자가 들어간다.
    val kotlinLogo = """| //
                   .| //
                   .|/ \"""
    println(kotlinLogo)
}

 

결과
| //
                   .| //
                   .|/ \

 

반응형

Designed by JB FACTORY