011. 문자열과 정규식

문자열과 정규식

코틀린의 문자열은 Java의 문자열과 정확히 일치한다.

코틀린은 여기에 몇 가지 유용한 기능을 추가로 더 제공하고 있는데, 대표적인 기능인 split()을 살펴보자.

Split

split()은 크게 두 가지로 분류된다.

먼저 toRegex()를 이용해 정규식을 명시적으로 생성하는 방법이다.

1
2
>>> println("12.345-6.A".split("\\.|-".toRegex()))
[12, 345, 6, A]

두 번째 방법은 tokenizer를 여러 개 입력 받아 분할하는 방법이다.

1
2
>>> println("12.345-6.A".split(".", "-"))
[12, 345, 6, A]

참고 Java는 .을 정규식으로 넣으면 모든 문자를 나타내는 것으로 이해한다. 코틀린은 이러한 실수를 줄여주는 것이다.

정규식과 삼중따옴표 문자열

두 개의 예시를 들어 살펴보겠다.

첫 번째 예시는 문자열에서 경로 / 파일명 / 확장자를 뽑아내는 것이다.

1
2
3
4
5
6
7
8
9
10
11
fun parsePath(path: String) {
val directory = path.substringBeforeLast("/")
val fullName = path.substringAfterLast("/")
val fileName = fullName.substringBeforeLast(".")
val extension = fullName.substringAfterLast(".")
println("Dir: $directory, name: $fileName, ext: $extension")
}

/* 출력 결과 */
>>> parsePath("/Users/yole/kotlin-book/chapter.adoc")
Dir: /Users/yole/kotlin-book, name: chapter, ext: adoc

두 번째는 정규식을 이용해 문자열에서 경로 / 파일명 / 확장자를 뽑아내는 것이다.

을 사용하고, 두 번째 예시는 일반적인 정규식을 적용한다.

1
2
3
4
5
6
7
8
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")
}
}

여기서 """문자열""" 삼중 따옴표를 확인할 수 있는 데, 삼중 따옴표를 쓰면 중간에 이스케이프 문자를 처리할 필요가 없어진다.

여러 줄로 이루어진 삼중 따옴표 문자열

삼중 따옴표 안에서는 줄 바꿈 표현하는 아무 문자열이나 그대로 전부 보전된다.

1
2
3
4
5
6
7
8
val kotlinLogo = """| //
.|//
.|/ \"""

>>> println(kotlinLogo.trimMargin("."))
| //
|//
|/ \