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 |