val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"
fun getPattern(): String = TODO()
Triple-quoted strings are not only useful for multiline strings, but also for creating regex patterns as you don't need to escape a backslash with a backslash.
The following pattern matches a date in the format 13.06.1992
(two digits, a dot, two digits, a dot, four digits):
fun getPattern() = """\d{2}\.\d{2}\.\d{4}"""
Using the month
variable rewrite this pattern in such a way that it matches the date in the format 13 JUN 1992
(two digits, a whitespace, a month abbreviation, a whitespace, four digits).
val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"
fun getPattern(): String = """\d{2} $month \d{4}"""
이번 문제는 정규표현식에 대한 이해가 있어야지 풀 수 있는 문제였습니다.
우선 getPattern()
함수가 반환하는 문자열은 """
로 생성된 raw 문자열입니다. raw 문자열은 이스케이프 문자를 사용하지 않아도 되기 때문에 정규표현식 패턴을 만들기에 용이합니다.
문제에서 요구한 13 JUN 1992
패턴은 앞, 뒤는 예제처럼 \d{2}
표현식을 사용하면 되고, 가운데 달이 들어가는 부분이 헛갈렸던 것 같습니다. 정규표현식을 찾아보니 ()
는 안에 들어가있는 문자가 포함되어야 한다는 것이고, |
는 우리가 흔히 알고있는 or 연산과 동일했습니다.
즉, month 변수를 그대로 문자열에 넣어서 반환해주면 되는데, 이때 문자열 템플릿을 활용하면 해결할 수 있습니다.
"""\d{2} $month \d{2}"""
에서 $
문자는 템플릿 표현식의 시작을 알리는 기호입니다. 이처럼 작성하면 실제로는 """\d{2} (JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC) \d{2}"""
와 같이 문자열이 생성되어 반환됩니다.
문자열 리터럴은 템플릿 표현식을 포함할 수 있습니다. 이는 값이 결정되고 결과가 문자열로 연결된 코드 조각이라 볼 수 있고, 달러 기호($
)로 시작되고 간단한 이름이 붙습니다.
val i = 10
println("i = $i") // prints "i = 10"
또는 중괄호({}
) 안에 임의의 표현식을 작성할 수 있습니다.
val s = "abc"
println("$s.length is ${s.length}")
만약, raw 문자열에서 $
문자를 표현해야 한다면 홑따옴표 ''
를 사용하여 표현할 수 있습니다.
val price = """
${'$'}9.99
"""
Kotlin은 문자열 내부에서 템플릿 표현식을 사용할 수 있도록 지원합니다. 또한 Kotlin에서는 문자열을 연결하는 방식보다는 문자열 템플릿과 raw 문자열이 성능 상의 이점을 가지고 있다고 소개합니다. 문자열 템플릿은 $
문자 뒤에 간단한 식을 붙여서 사용 가능하고, 또는 $
문자 뒤에 중괄호({}
)를 사용하고 내부에 식을 작성하여 사용할 수도 있습니다.
Kotlin Reference - Basics / Basic Types