[코틀린인액션] 문자열 등

코틀린에서의 문자열

  • 자바의 문자열과 동일하다
  • 자바의 문자열에 API 추가적인 확장 함수 제공
    • 그냥 좀더 편하게 쓸 수 있다곤하는데 체감은 안됨

문자열 나누기

  • String.split 은 실제 정규식을 씀.
  • split(”.”) 은 마침표 . 를 정규식의 모든 모든 문자를 나타내는 와일드 카드로 해석함
    fun main() {
        val split = "12.345-6".split(".", "-")
        println("split = ${split}");
    }
    
    split = [12, 345, 6]

정규식의 사용

  • toRegex 확장 함수를 통해 문자열을 정규식으로 변환한다.
    fun main() {
        val toRegex = "[.\\-]".toRegex()
        val split = "12.345-6.A".split(toRegex)
        println("split = $split");
    }
    
    split = [12, 345, 6, A]
    fun main() {
        val toRegex = "[.\\-*]".toRegex()
        val split = "12.3*4\\5-6.A".split(toRegex)
        println("split = $split");
    }
    
    split = [12, 3, 4\5, 6, A]
    • [ , ] 는 정규표현식에서 문자 집합을 정의하는 데 사용
      • 대괄호 안의 문자는 이 중 어느 하나에 해당하는 문자를 찾는다.
    • \\-
      • 는 하이픈을 별도로 이스케이핑이 필요하기 때문에 정의되었다고 한다.
      • [A-Z]
        • A 부터 Z 까지의 의미를 나타내느 범위 지정이 정규식에서 적용된다 원래는…

3중 따옴표 문자열

파일 경로 파싱 예제

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")
    }
}

fun main() {
    parsePath("/Users/yole/kotlin-book/chapter.adoc")
}

Dir: /Users/yole/kotlin-book, name: chapter, ext: adoc
  • (.+)
    • 하나의 그룹을 의미
  • 첫 번째 (.+): 마지막 / 이전의 모든 문자에 매치됩니다 (디렉터리).
  • 두 번째 (.+): 마지막 / 이후부터 마지막 . 이전의 모든 문자에 매치됩니다 (파일 이름).
  • 세 번째 (.+): 마지막 . 이후의 모든 문자에 매치됩니다 (확장자).
  • matchEntire
    • 은 전체 문자열이 정규식 패턴과 매치되는 경우에만 결과 반환함
  • destructured
    • 매치된 그룹들을 바로 분해해서 변수에 할당이 가능함.

    그럼 matchResult 의 타입이 뭐지?

    • 타입이 없어서 좀 보기 불편하다..

    MatcherMatchResult 를 반환하네..

    • 이후에
    • destructured 수행시
      • groups 안에 정규식에 따라 나뉜 값들을 보관한다.
      • 나뉜 값이 String 에서 나눠진 MatchGroup 의 범위까지 포함되어 있는 듯하다.

Uploaded by N2T