TIL/공부

03/04 코틀린 Regex - 정규 표현식(Regular Expression)

sos000303 2024. 3. 4. 19:50
728x90

아까 본 아래 코드에서 나온 Regex와 그 표현에 대해 알아보자.

class Solution {
    fun solution(babbling: Array<String>) = babbling.count { it.matches("^(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+$".toRegex()) }
}

우선 Regex - 정규표현식이 무엇인가 부터 알아봐야한다. 코틀린의 경우 자료가 부족해 문법의 경우 부득이하게 자바, 자바스크립트의 정규표현식 문서를 참조했다.

Regex - 정규표현식

정규 표현식이란 특정한 규칙을 가진 문자열의 일반형이라고 할 수 있다.

주로 특정 문자열이 규칙을 만족하는지 검사할때 사용된다.

 

메타(Meta) 문자

정규표현식에서 사용되는 연산기호를 메타 문자라고 한다. 이러한 메타문자와 문자열의 조합으로 하나의 정규표현식을 만들 수 있다.

메타 문자 설명
.(온점) 모든 문자
|(시프트 역슬래시) OR
^ 전체 문자열이 다음에 오는 문자로 시작
& 전체 문자열이 에 오는 문자로 끝남                          ex) ^ac$ -> a로 시작라고 c로 끝나는 문자열
\s <-> \S 공백 문자(space, tap, new line)   <- >    공백문자가 아닌 문자
\d <-> \D 숫자(digit)    <->    숫자가 아닌 문자
\w <-> \W 알파벳 + 숫자 + '_'(언더바) (word)    <->  알파벳 + 숫자 + '_'(언더바)를 제외한 문자(non-word)
\n new line(줄 바꾸기)
\b 문자와 비 문자 사이의 경계 지점, 해당 되는 특정 문자는 없다. 
ex) ^I'm man$ 에서 ^vIv'vmv vmanv$ v로 표시한 모든 공간
\B \b와 반대로 문자와 문자, 비문자와 비문자의 사이의 경계지점을 뜻한다.
ex) ^I'm man$ 에서 ^I'm mvavn$ v로 표시한 모든 공간
[] 내부의 문자 중 하나(여러개 있다면 인덱스가 가장 낮은 문자)    ex) [abc] -> a, b, c 중 하나, a우선 선택
[^문자] ^뒤에 문자를 작성하며 작성된 문자를 제외한 문자 중 인덱스가 가장 낮은 문자
[\특수문자] \뒤에 오는 특수문자(메타문자 등)를 정규문자로 취급한다.
[a-z] 소문자 전체 범위
[A-Z] 대문자 전체 범위
[0-9] 숫자 전체 범위
(문자열) 소괄호 내부의 문자열은 하나의 단위로 캡쳐한다. 이러한 단위는 $1~$9로 참조가 가능하며 $0은 매칭된 전체 문자열을 참조한다.
(?<이름>문자열) 그룹에 이름을 부여할 수 있다.
(?: 문자열) 패턴으로써 작동하지만 캡쳐할 수 없다.
(?=문자열) 앞쪽 문자열을 기준으로 그룹 조건을 만족하는 지 비교한다.  ex) a(?=bc) -> a다음에 bc가 오는 문자열a
(?!문자열) 위 메타문자와 반대의미로 뒤 문자열이 오지 않는 문자열을 찾는다.
(?<=문자열) 뒤쪽 문자열을 기준으로 앞에 조건을 만족하는 지 비교한다. (?=>bc)a -> a앞에 bc가 있는 문자열a
* 뒤 문자가 0번 이상 나온다.
+ 뒤 문자가 1번 이상 나온다.
? 뒤 문자가 0번 또는 1번 나온다.
{n} 뒤 문자가 n번 나온다.
{n,} 뒤 문자가 n번 이상 나온다.
{,m} 뒤 문자가 m번 이하 나온다.
{n, m} 뒤 문자가 n번 이상 m번 이하 나온다.
플래그 정규 표현식을 나타내는 표시 이후에 플래그를 나타내고 전체에 조건을 활성화 한다.
g global, 패턴에 대응하는 첫 인덱스의 문자열만이 아닌 문자열 전체에 대해 탐색
i ignore, 대소문자를 구분하지 않음
m multi line 행(줄) 구분 없이 문자열 탐색
u unicode ASCII가 아닌 유니코드로 처리

코드 해석

class Solution {
    fun solution(babbling: Array<String>) = babbling.count { it.matches("^(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+$".toRegex()) }
}

따라서 위 코드는 다음과 같이 해석할 수 있다.

class Solution {
    fun solution(babbling: Array<String>) = babbling.count { it.matches("^(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+$".toRegex()) }
}
/* (바로 뒤에 aya가 오지 않는 aya 또는
바로 뒤에 ye가 오지 않는 ye 또는
바로 뒤에 woo가 오지 않는 woo 또는
바로 뒤에 ma가 오지 않는 ma) 가 한 번 이상 반복되는 문자열을 만족하는 babbling 원소의 갯수 */

문자열 검색할 때 사용할 수 있도록 꼭 기억하자

 

728x90

'TIL > 공부' 카테고리의 다른 글

03/07 코틀린 생명주기  (0) 2024.03.07
03/06 코틀린 Context  (0) 2024.03.07
02/27 Kotlin 바인딩  (0) 2024.02.27
02/23 Developers Kotlin - Intro To Kotlin(2)  (0) 2024.02.23
02/22 Developers Kotlin - Intro To Kotlin(1)  (0) 2024.02.22