3. 문자 집합으로 찾기 - 손에 잡히는 10분 정규 표현식 |
* 여러 문자 중 하나와 일치시키기
-
모든 문자가 아니라 특별한 문자와 일치하는 것을 찾고 싶을 때 정규식에서는 메타 문자인 대괄호( [] ) 를 사용해 문자 집합을 표현한다.
대괄호는 문자 집합을 정의한다.
대괄호 안에 있는 문자는 모두 집합의 구성원이 되며, 집합에 속한 문자 가운데 하나가 일치한다.
집합에 속한 문자가 모두 일치할 필요는 없다.
-
정규식이 제대로 동작하는지 알아보는 일은 까다로울 수 있다.
얻고자 하는 결과의 패턴이 일치하는지 확인하는 일은 매우 쉽지만, 진짜 도전 과제는 얻고 싶지 않은 결과도 일치하는지 확인하는 일이다.
-
문자집합은 흔히 대소문자를 구별하지 않고 검색하거나 검색할 부분의 특정 영역만 대소문자를 구별하지 않을 때 사용한다.
대소문자를 구별하지 않고 모든 문자를 찾아도 된다면, 이런 기술은 필요 없다.
이런 식의 검색은 부분적으로 대소문자를 구별하지 않을 때만 사용한다.
ex) [CcAaTt]
* 문자 집합 범위 사용하기
-
정규식을 사용할 때, 0~9, A~Z 같이 문자들의 범위를 지정하는 일이 자주 있음을 알게 될 것이다.
문자 범위를 단순하게 만들 때 정규식에서는 특별한 메타 문자인 하이픈(-)을 제공한다.
-
A-Z 는 A부터 Z사이에 있는 모든 대문자와 일치
a-z 는 a부터 z사이에 있는 모든 소문자와 일치
A-F 는 A부터 F사이에 있는 대문자와 일치.
A-z는 아스키(ASCII) 문자 A 와 아스키 문자 z 사이에 있는 모든 문자와 일치 (이 패턴은 사용하지 않도록 하자. Z 와 a 사이에 속하는 아스키 문자 중에는 여는 대괄호( [ ) 와 캐럿 ( ^ ) 같은 문자도 포함됨)
-
아스키 문자 가운데 아무거나 두 개를 선택해 한 범위의 시작과 마지막을 표시할 수 있지만, 실제 사용할 때는 숫자 전체를 범위로 정하기도 하고, 일부만 정하기도 한다.
마찬가지로 영문자도 일부만 범위로 지정하기도 하고 전체를 지정하기도 한다.
-
범위를 지정할 때는 두 값 중 더 큰 값이 앞에 나오면 안 된다
예를 들어 [3-1]처럼 말한다.
이렇게 하면 동작하지 않는다.
또한 패턴 자체가 동작하지 않을 수도 있다.
-
하이픈(-)은 대괄호( [] ) 안에서만 메타 문자인 특수한 메타 문자다.
집합 밖에서 하이픈( - ) 은 단순히 문자 그대로 하이픈 ( - ) 과 일치한다.
그래서 집합 밖에서는 하이픈 문자에 굳이 역슬래시를 붙일 필요가 없다.
* 제외하고 찾기
-
문자 집합은 일반적으로 찾고 싶은 문자의 목록을 정하는 데 쓰지만, 찾을 때 제외하고 싶은 문자 목록을 정할 때도 쓸 수 있다.
다른 말로, 여기서 지정한 목록을 제외하기 라고 할 수 있다.
-
몇 개만 빼고 대부분의 문자를 포함해야 할 경우에는 패턴이 너무 길어지므로 원하는 원하는 문자를 모두 나열하기보다는 캐럿( ^ ) 문자를 써 제외할 문자 집합을 지정한다.
-
[^0-9] 는 정해진 범위 내에 있는 숫자와 일치하지 않는다.
캐럿문자는 이 문자 바로 뒤에 있는 문자나 범위뿐만 아니라 집합 안에 있는 문자나 범위를 모두 제외한다.
* 요약
-
메타 문자인 여는 대괄호 ( [ ) 와 닫는 대괄호 ( ] ) 는 문자 집합을 정의하는데, 그 집합 구성원 중에 한 문자라도 일치해야 한다.(AND 가 아닌 OR다.)
문자 집합은 문자를 일일이 열거하거나 하이픈(-) 문자를 사용해 범위를 설정할 수 있다.
또 캐럿(^) 문자는 지정한 문자들을 제외한 어떤 것들과 일치시킨다.
'프로그래밍 놀이터 > Tips' 카테고리의 다른 글
[도서 정리] 5. 반복 찾기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.27 |
---|---|
[도서 정리] 4. 메타 문자 사용하기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.26 |
[도서 정리] 2. 문자 하나 찾기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.24 |
[도서 정리] 1. 정규 표현식 소개 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.23 |
[컨퍼런스] 드로아드 나이츠 (Droid Knights) 행사 참여! (0) | 2019.06.11 |
댓글