[코틀린, kotlin] 정규표현식(Regex) 기초와 사용방법

정규표현식은 문자열 내에서 패턴을 정의하고 검색, 추출, 치환 등 다양한 작업을 수행할 수 있습니다. 코틀린에서는 Regex 클래스를 사용하여 정규표현식을 다루며, 이 클래스의 기능을 활용하여 문자열을 다룰 수 있는데요. 자세한 사용법과 기능에 대해 알아보겠습니다.

1. 코틀린 정규표현식 기초

^ : 문자열의 시작을 의미
$ : 문자열의 끝을 의미
. : 문자 한 개를 의미. 즉 '.' 이 위치한 곳에 어떤 문자든지 1개의 문자가 들어간다.
[ ] : 대괄호에 있는 문자 중 한 개를 의미. 가령 [xyz]는 x, y, z 중에 하나를 선택한다. 이 때 대괄호 안에 '-'를 써서 [a-z]는 a~z까지 중에서 한개, [0~9]는 0에서 9까지 중 하나의 의미도 표현할 수 있다.
[^] : '^'은 not의 의미인데, 대괄호에서 쓴다면, [^xyz]는 x, y, z 빼고 나머지, 즉 a~w, 0~9 등 x, y, z를 제외한 모든 문자를 의미한다. [^a-z]는 알파벳을 뺀 나머지 문자
| : or을 의미한다. x|y는 x 또는 y
( ) : 공통되는 부분을 묶을 때 등 서브 패턴을 지정할 때 사용할 수 있습니다. abc|abd -> ab(c|d)로 바꿀 수 있다.
? : 바로 앞의 문자가 0번 또는 1번 나타남을 나타낸다. 예를 들어, ab?c는 'ac'와 'abc'와 매치된다.
* : 문자가 0회 이상 등장한다. 예를 들어, a*b는 b, ab, aab, aaab, aaaab
+ : 문자가 1회 이상 등장한다. 예를 들어, a+b는 ab, aab, aaab
{n} : 바로 앞의 문자가 정확히 n번 나타남을 나타낸다. 예를 들어, ab{2}c는 'abbc'
{n,} : 바로 앞의 문자가 최소 n번 이상 나타남을 나타낸다. 예를 들어, ab{2,}c는 'abbc', 'abbbc'
{n, m} : 바로 앞의 문자가 최소 n번 이상, 최대 m번 이하로 나타남을 나타낸다. 예를 들어, ab{2,4}c는 'abbc', 'abbbc', 'abbbbc'
\s : 공백 
\t : 탭 
\d : 숫자, 즉 [0~9]와 같다.
\w : 알파벳 문자와 숫자를 포함하는 문자


2. 특수문자 이스케이프

정규표현식에는 일부 특수문자가 있습니다. 이러한 특수문자를 검색하려면 이스케이프(escape) 문자 \를 사용하여 표현 할 수 있어요. 
\. : 실제 . 문자를 나타낸다.
\* : 실제 * 문자를 나타낸다.
\+ : 실제 + 문자를 나타낸다.
\\ : 실제 \ 문자를 나타낸다.

그러므로 실제 공백이나 탭을 사용하려면 \\s, \\t와 같이 사용하여야 합니다.


3. 정규표현식 함수

(1) matches : 전체 문자열이 패턴과 정확히 일치하는지 확인한다.
val pattern: Regex = Regex("hello")
val input = "hello"
val isMatched = pattern.matches(input) // true
(2) find : 패턴과 일치하는 부분 문자열을 찾습니다.(첫 번째 일치하는 부분만 반환)
val pattern: Regex = Regex("a.b")
val input = "xayb xcyd"
val matchResult = pattern.find(input)
val matchedString = matchResult?.value // "axyb"
(3) findAll : 패턴과 일치하는 모든 부분 문자열을 찾습니다.(모든 일치하는 부분을 리스트로 반환)
val pattern: Regex = Regex("a.b")
val input = "xayb xcyd axzb"
val allMatches = pattern.findAll(input)
val matchedStrings = allMatches.map { it.value }.toList() // ["axyb", "axzb"]
(4) replace : 패턴과 일치하는 부분을 다른 문자열로 치환한다.
val pattern: Regex = Regex("a.b")
val input = "xayb xcyd"
val replaced = pattern.replace(input, "123") // "x123 xcyd"