정규 표현식(Regular Expressions)은 복잡한 문자열을 패턴/규칙으로 표현하여 처리하는 기법이다. 정규 표현식은 줄여서 "정규식"이라고도 부른다.
"메타 문자"란, 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.
.
: 개행 문자(\n)를 제외한 문자 하나를 의미한다. a.b는 a와 b 사이에 문자 하나가 있는 문자열을 의미한다.
[^]
: not을 의미한다. [^0-9]는 숫자가 아닌 문자를 의미한다.
^
: 문자열의 시작을 의미한다. ^kotlin은 문자열의 시작은 무조건 kotlin이어야함을 의미한다.
$
: 문자열의 끝을 의미한다. kotlin$은 문자열의 마지막은 무조건 kotlin이어야함을 의미한다.
[]
: 대괄호에 있는 문자들 중 하나의 문자를 의미한다. [a-zA-Z]는 알파벳 대소문자 중 하나의 문자임을 의미한다.
|
: or을 의미한다. a|b는 a 또는 b를 의미한다.
{}
: 반복을 의미한다. a{2}b는 aab를 의미하고, a{2, }는 a가 2번 이상 반복됨을 의미하고, a{2, 5}는 a가 2번 이상 5번 이하 반복됨을 의미한다.
*
: 문자가 0회 이상 반복됨을 의미한다. a*는 a가 0번 이상 반복됨을 의미한다. { , a, aa, ...}
+
: 문자가 1회 이상 반복됨을 의미한다. a+는 a가 1번 이상 반복됨을 의미한다. {a, aa, aaa, ...}
?
: 문자가 0회 또는 1회 나옴을 의미한다. a?b는 {b, ab}이다.
\
: 이스케이프 처리를 의미한다. \s는 "\s"문자열로 처리된다.(whitespace가 아니라)
Kotlin에서는 Regex 클래스의 객체를 이용해서 정규 표현식을 처리한다.
Regex("pattern")
예시 )
val reg = Regex("[a-zA-Z0-9]+")
val reg = "pattern".toRegex()
예시)
val reg = "[a-zA-Z0-9]+".toRegex()
val matchResult: MatchResult? = regex.matchEntire("A1B2")
일치한다면 regex.matchEntire()는 MatchResult 객체
를 반환하고,
일치하지 않으면 null
을 반환한다.
Regex 클래스의 메서드들은 MatchResult 클래스 객체에 결과값을 담아서 반환한다.
❣️ 결과 확인 (MatchResult.value, MatchResult.range, MatchResult.next())
val matchResult: MatchResult? = Regex("[\\w]+").find("abcde;12345;a1b2c3d4e5")
val value = matchResult!!.value
println(value) // abcde
val matchResult: MatchResult? = Regex("[\\w]+").find("abcde;12345;a1b2c3d4e5")
println(matchResult.range) // 0..4
val matchResult: MatchResult = Regex("[\\w]+").find("abcde;12345;a1b2c3d4e5")!!
println(matchResult.value) // abcde
println(matchResult.next()?.value) // 12345
println(matchResult.next()?.next()?.value) // a1b2c3d4e5
println(matchResult.next()?.next()?.next()) // null