fun parsePath2(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중 따옴표 문자열에서는 `\` 를 포함한 어떤 문자열도 escape 할 필요가 없다.
일반 문자열에서 마침표 기호를 escape 하려면 `\\.` 라고 써야 하지만, 3중 따옴표 문자열에서는 `\.` 라고 쓰면 된다.
이 예제에서 쓴 정규식은 슬래시와 마침표를 기준으로 `path` 를 세 그룹으로 분리한다.
첫 그룹인 `(.+)` 는 마지막 슬래시 이전 부분 문자열이다.
두 번째 그룹은 마지막 마침표 이전이면서 마지막 슬래시 이후인 부분 문자열이다.
세 번째 그룹은 나머지 모든 문자가 들어간다.
정규식 엔진은 각 패턴을 가능한 가장 긴 부분 문자열과 매치하려고 한다. 그래서 `"path/to/dir/filename.ext"` 에서는 (.+)/ 와 일치하는 패턴을 찾으면 `"path"` 가 아닌 `"path/to/dir"` 라는 부분 문자열이 된다. 이와 관련해 정규식 문서에서 greedy 나 lazy 를 찾아보면 좋다.
그렇게 정규식으로 `MathResult` 타입의 `mathResult` 를 생성한다.
이것이 성공하면 그룹별로 분해한 매치 결과를 의미하는 `destructured` 프로퍼티를 각 변수에 대입한다.
구조 분해 선언을 사용한 것이다.
이에 대해 자세한 내용은 나중에 다시 다루겠다.
public interface MatchResult {
public open val destructured: kotlin.text.MatchResult.Destructured /* compiled code */
// ...
}
`MathResult` 인터페이스와 그 프로퍼티 `destructured`
여러 줄 3중 따옴표 문자열
3중 따옴표 문자열은 줄 바꿈을 나타내는 아무 문자열이나 그대로 들어간다.
즉, 줄바꿈이 있는 텍스트를 쉽게 만들 수 있다.
여러 줄 문자열에는 들여쓰기나 줄 바꿈을 포함한 모든 문자가 들어간다.
fun multilineString() {
val kotlinLogo = """| //
.| //
.|/ \"""
println(kotlinLogo.trimMargin("."))
}
결과
multiline String 을 코드에서 더 보기 좋게 표현하고 싶다면 들여쓰기를 하되 들여쓰기의 끝부분을 특별한 문자열로 표시하고 `trimMargin` 을 사용해서 그 문자열과 그 직전의 공백을 제거한다.
위 예제 코드에서는 `.` 를 구분 문자열로 사용했다.
참고로 `trimMargin` 의 구분문자열 기본값은 `|` 이다.
multiline String 에는 줄 바꿈이 들어가지만 줄 바꿈을 `\n` 특수문자를 사용할 수는 없다.
반면, `\` 를 문자열에 넣고 싶으면 따로 escape 할 필요도 없다.
3중 따옴표 문자열 안에 String Template(문자열 템플릿)을 사용할 수도 있다.
만약 `$` 라는 문자를 문자열 안에 넣어야 한다면 escape 할 수 없기 때문에 `${'$'}` 처럼 문자열 템플릿 안에 '$' 문자를 넣어야 한다.
일반 문자열 리터럴에 escape 시퀀스를 삽입하는 것보다 multiline String 을 권고한다.
multline String 에서 들여쓰기를 유지하려면 결과 문자열에 내부 들여쓰기가 필요하지 않은 경우에는 TrimIndent를 사용하고, 내부 들여쓰기가 필요한 경우에는 TrimMargin을 사용하라.
println("""
Not
trimmed
text
"""
)
println("""
Trimmed
text
""".trimIndent()
)
println()
val a = """Trimmed to margin text:
|if(a > 1) {
| return a
|}""".trimMargin()
println(a)
// print
/*
Not
trimmed
text
Trimmed
text
Trimmed to margin text:
if(a > 1) {
return a
}
*/
자바의 multiline String 사용법 차이
Java 15 이전에는 여러 줄 문자열을 만드는 방법 중 예로 `String` 클래스의 `join()` 함수를 사용할 수 있다.