문자열과 정규식 다루기

코틀린의 문자열은 자바의 문자열과 온전히 호환된다.
자바 코드에서 받은 문자열을 코틀린 표준 라이브러리에 전달해도 전혀 문제 없으며, 특별한 변환이나 래퍼도 생기지 않는다.
코틀린은 다양한 확장함수를 제공하여 표준 자바 문자열을 보다 편하게 다룰 수 있도록 제공한다는 차이 정도가 있다.

문자열 나누기

자바에서 문자열을 나누는 대표적인 방법은 split함수이다.
그런데 이 함수의 구분 문자열은 정규식으로 작성되기 때문에 .을 구분 문자열에 집어넣으면 원하는 결과를 얻을 수 없다.

코틀린의 split

코틀린의 스플릿은 여러가지 다른 조합의 파라미터를 받을 수 있다.
또한 여러개의 인자를 받을 수도 있기 때문에 문자열.split("구분문자열1","구분문자열2")와 같은 형태로 사용하는 것도 가능하다.
정규식의 문법은 자바와 똑같은데, 그래서 정규식을 인자로 받는 split을 사용할 경우에는 마침표나 대시는 따로 이스케이프를 시켜주어야한다.
혹은 코틀린에서 제공하는 .toRex를 사용하여 패턴을 정규식으로 바꾸는 방법도 존재한다.

코틀린 정규식 활용법 바로가기

정규식과 문자열

파일명을 디렉토리,파일이름,확장자로 구분하는 방법은 크게 두가지가 있다.
첫번째 방법은 정규식을 사용하는 방법이고 두번째 방법은 String의 확장함수를 사용하는 방법이다.

1번 방법 코드

fun pharsingPath(path:String){
    val directory=path.substringBeforeLast("/")
    //"/"를 기준으로 앞뒤를 나눠주는 데에 사용되는 함수. 디렉토리에는 마지막 슬래쉬의 앞만 들어가게 된다.
    val fullName=path.substringAfterLast("/")
    val fileName=fullName.substringBeforeLast(".")
    val extension=fullName.substringAfterLast(".")
    println("디렉토리:${directory},파일명:${fileName},확장자:${extension}")
}
fun main() {
pharsingPath("/Users/Documet/Kotlin/chapter.md")
}

코틀린에서는 정규식을 사용하지 않고도 문자열을 쉽게 파싱할 수 있기 때문에, 정규식이 필요할 때에도 코틀린의 라이브러리를 사용하는 경우가 꽤 많다.
정규식은 강력하지만, 이후에 알아보기 어려울 수도 있다.

정규식을 활용한 코드

fun parsePath(path: String) {
    val regex = """(.+)/(.+)\\.(.+)""".toRegex()
    val matchResult = regex.matchEntire(path)
    if (matchResult != null) {
        val (directory, filename, extension) = matchResult.destructured
        println("Dir: $directory, name: $filename, ext: $extension")
    }
}

3중 따옴표를 활용하면 어떤 문자도 이스케이프를 할 필요가 없다.
그래서 일반적인 정규식에서는 \\.이라고 써야하는 마침표 기호를 삼중 따옴표 문자열에서는 \.로 작성하면 된다.

여러 줄의 3중 따옴표 문자열

3중 따옴표 문자열은 문자열 이스케이프를 피하기 위해서만 사용하는 도구가 아니다
3중 따옴표 문자열 내에서는 아무 문자열이나 그대로 들어가기 때문에 형태가 복잡한 텍스트도 쉽게 문자열의 형태를 유지하면서 그대로 출력하는 것이 가능하다.
이러한 특성을 활용하면 여러 줄의 텍스트 출력을 만들어내는 연산을 검사할 때에도 쉽게 예상값과 결과값을 비교할 수 있다.

댓글남기기