개발
정규표현식 정리 + 사례 연구
인공지능 대학생
2020. 11. 2. 10:49
1. 정규표현식 사용 이유
- 정의: 패턴에 입각한 텍스트를 찾고 수정하는데 쓰는 문자열
- 특징: 범용성, 이식성
- 단점: 애플리케이션 별로 구문 차이가 있거나 지원하지 않는 기능이 있을 수 있다.
원하는 값을 찾는 것보다 원하지 않는 값이 찾아지지 않도록 하는 것이 매우 어렵다.
(※ 애플리케이션은 보통 자바스크립트, 자바, 텍스트 툴 과 같은 프로그래밍 툴)
2. 문자 하나
예문 KBS1에서 하는 방송 KBS2에서 하는 방송 |
정규표현식 KBS |
결과 KBS1에서 하는 방송 KBS2에서 하는 방송 |
설명 일반 텍스트 검색도 정규표현식의 일종 |
예문 KBS1에서 하는 방송 KBS2에서 하는 방송 |
정규표현식 KBS. |
결과 KBS1에서 하는 방송 KBS2에서 하는 방송 |
설명 . 은 메타문자 - 모든 문자 (2byte 문자 포함) KBS. 은 "KBS가", "KBSS" 등도 소비 된다. KBS\d 로 숫자문자로 제한 가능 (\d = decimal) |
3. 문자 집합 - [ ]
예문 샘플 A를 선택 샘플 B를 선택 |
정규표현식 [AB] |
결과 샘플 A를 선택 샘플 B를 선택 |
설명 [ ] 내에 포함된 문자들 중 하나라도 일치할 경우 소비(consume). |
예문 샘플 가를 선택 샘플 나를 선택 |
정규표현식 샘플 [가-힣] |
결과 샘플 가를 선택 샘플 나를 선택 |
설명 연속된 문자를 표현할때 - 를 사용 - 를 사용할 때는 아스키 혹은 유니코드의 값 기준으로, [작은값-큰값] 으로 기입해야 한다. ※ 주: 문자집합에서 보통 한글과 같은 2byte 문자를 모두 취급하진 않는다. 한글을 지원하는 텍스트툴에서 지원한다. (모든 예제는 Notepad++ 로 테스트함) |
예문 샘플 가를 선택 샘플 나를 선택 샘플 하를 선택 |
정규표현식 샘플 [^가나] |
결과 샘플 가를 선택 샘플 나를 선택 샘플 하를 선택 |
설명 문자집합 내 문자의 부정 |
4. 메타 문자
정규표현식에서 문자 외에 특수한 기능을 수행하는 문자.
중첩, 조합 사용 가능.
기본 메타 문자 | . | [ ] [^ ] [ - ] \ |
모든 문자 일치 왼쪽 or 오른쪽 일치 문자 집합 구성원 중 하나와 일치 문자 집합 구성원을 제외하고 일치 범위 정의(예: [A-Z] ※주: 한글은 [가-힣]) 다음에 오는 문자 이스케이프 |
수량자 | * *? + +? ? {n} {m,n} {n,} {n,}? |
0개 이상 연속 일치 게으른 * 1개 이상 연속 일치 게으른 + 0 or 1개 일치 n번 일치 m~n번 일치 n번 이상 일치 게으른 {n,} |
위치 지정 | ^ \A $ \Z \< \> \b \B |
문자열 시작 문자열 시작 문자열 끝 무자열 끝 단어 시작 단어 끝 단어 경계 \b 의 반대 (단어 경계가 아닌 연속된 문자내에서 검색) |
특수한 문자 | [\b] \c \d \D \f \n \r \s \S \t \v \w \W \x \0 |
백스페이스 제어 문자 모든 숫자 \d 의 반대 페이지 넘김 (form feed) 줄바꿈 캐리지 리턴 공백 문자 ( ) \s 의 반대 탭 수직 탭 영숫자, 문자, 밑줄(_) (※주: 한글(2byte)은 동작X) \w 의 반대 16진수 값 8진수 값 |
역참조와 전후방 탐색 | ( ) \1 ?= ?<= ?! ?<! ?(backreference)true ?(backreference)true|false |
하위 표현식 1번 하위 표현식. 2번 하위 표현식은 \2 전방탐색 후방탐색 not 전방탐색 not 후방탐색 조건 지정 else 추가된 조건 지정 |
대소문자 변환 | \E \l \L \u \U |
\L or \U 변환을 끝냄 다음에 오는 글자를 소문자로 \E 를 만날때까지의 문자를 소문자로 다음에 오는 글자를 대문자로 \E 를 만날때까지의 문자를 대문자로 |
변경자 | (?m) | 다중행 모드 |
POSIX 문자 클래스
- 메타 문자 및 여러 문자 집합을 줄여 쓰는 방법
- 많은 정규 표현식 구현에서 지원 (※ 주: 자바스크립트 미지원)
[:alnum:] | alphabet + number, 모든 영숫자 (= [a-zA-Z0-9]) |
[:alpha:] | alphabet, 모든 영문자 (= [a-zA-Z]) |
[:blank:] | 빈칸 or 탭 (= [ \t]) |
[:cntrl:] | 아스키 제어 문자 (아스키값 0~31, 127) |
[:digit:] | 한자리 숫자 (= [0-9]) |
[:graph:] | space 를 제외한 [:print:] |
[:lower:] | 영문 소문자 (= [a-z]) |
[:print:] | 출력 가능한 모든 문자 |
[:punct:] | [:alnum:] 과 [:cntrl:] 가 아닌 모든 문자 |
[:space:] | 공백 문자 (= [\f\n\r\t\v]) |
[:upper:] | 영문 대문자 (= [A-Z]) |
[:xdigit:] | 16진수 숫자 (= [a-fA-F0-9]) |
예문 이대호가 어제 홈런 쳤나 이대호어제 홈런 쳤나 이대호 뭐 하는 선수야 |
정규표현식 - 단어 구분 \b이대호\b |
결과 이대호가 어제 홈런 쳤나 이대호어제 홈런 쳤나 이대호 뭐 하는 선수야 |
설명 \b = break 로 단어 구분을 표시 |
예문 이대호가 어제 홈런 쳤나 이대호어제 홈런 쳤나 이대호 뭐 하는 선수야 |
정규표현식 이대호[^을를이가\s] |
결과 이대호가 어제 홈런 쳤나 이대호어제 홈런 쳤나 이대호 뭐 하는 선수야 |
설명 상황 - 띄어쓰기 오류 있는 부분 검출 조사 [을를이가] 와 띄어쓰기(\s = space) 를 부정 \s = 모든 공백 문자 [\f\n\r\t\v] |
예문 4/12/20 11-4-2019 3/3/3 02-02-02 |
정규표현식 - 날짜 찾기 \d{1,2}[-\/]\d{1,2}[-\/]\d{2,4} |
결과 4/12/20 11-4-2019 3/3/3 02-02-02 |
설명 미국식 날짜 방식 찾기. \d{1,2} <- 월 찾기 [-\/] <- 월,일 구분자 중 하나 선택 ~ \d{2,4} <- 년도를 2자리 혹은 4자리로 표현 |
예문 <이대호:player>가 등장하는 <야구:sports> 게임 |
정규표현식 - 탐욕적(greedy) 검색 (기본값) <.*> |
결과 <이대호:player>가 등장하는 <야구:sports> 게임 |
설명 * 과 + 의 기본적인 검색은 탐욕적이다. 가능한한 많은 값을 검색한다. .* 의 경우 모든 문자의 0개 이상을 표현한다. 위 정규표현식에서 < 를 시작으로 가장 마지막의 > 와 일치하게 된다. |
예문 <이대호:player>가 등장하는 <야구:sports> 게임 |
정규표현식 - 게으른(lazy) 검색 (기본값) 1 <.*?> |
결과 <이대호:player>가 등장하는 <야구:sports> 게임 |
설명 *? 혹은 +? 를 사용하면 게으른 검색을 수행한다. 가장 가까운 값을 검색한다. 위 정규표현식에서 < 를 시작으로 가장 먼저 등장하는 > 까지 일치한다. |
정규표현식- 게으른(lazy) 검색 (기본값) 2 <[^<]+?:sports> |
결과 <이대호:player>가 등장하는 <야구:sports> 게임 |
설명 sports 항목맞 찾기 위해 <.*?:sports> 를 정규표현식으로 쓰면 탐욕적 탐색처럼 매칭이 된다. 이를 해결 하기 위해 적당한 제한문자를 중간에 넣어두어야 한다. 해당 예의 경우 [^<]+ 로 < 를 제외한 문자만을 찾았다. |
탐욕적 수량자 | 게으른 수량자 |
* | *? |
+ | +? |
{n,} | {n,}? |
5. 반복
예문 body { background-color: #fefbd8; } |
정규표현식 - 컬러값 찾기 #[[:xdigit:]]{6} |
결과 body { background-color: #fefbd8; } |
설명 POSIX 문법으로 16진수 문자를 이용해 컬러값 검색 + 16진수 문자를 {6} 으로 6번 반복 ※ 주: POSIX 문법으로 글자 표현 시 문자집합 [ ] 에 넣어야 정상적으로 동작한다. |
6. 위치
예문 <h1>html 태그 설명 <h1></h1>은 header 1번 폰트이다</h1> |
정규표현식 - 문장시작 일치 ^<h1> |
결과 <h1>html 태그 설명 <h1></h1>은 header 1번 폰트이다</h1> |
설명 ^를 문자집합 외부에서 사용시 문장라인의 처음 위치를 가리킨다. |
정규표현식 - 문장끝 일치 </h1>$ |
결과 <h1>html 태그 설명 <h1></h1>은 header 1번 폰트이다</h1> |
설명 $를 문자집합 외부에서 사용시 문장라인의 끝 위치를 가리킨다. |
7. 하위 표현식
예문 ABC Chocolate |
정규표현식 - 하위표현식 없을 시 {2,} |
결과 ABC Chocolate |
설명 {2,} 의 바로 앞에 있는 ; 를 2개 이상 찾게 됨. 전체 문자열을 묶기 위해 ( ) 를 사용해야 함 |
정규표현식 - 하위표현식 있을 시 ( ){2,} |
결과 ABC Chocolate |
설명 하위표현식 ( ) 로 묶은 부분을 전체 한문자로 취급하여 의 {2,} 2개 이상으로 검색 |
예문 ipAddress 127.0.0.1 |
정규표현식 - IP를 검색을 위한 중첩 하위표현식 (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])) |
결과 ipAddress 127.0.0.1 |
설명 ###. 부분을 {3} 3회 일치, ### 부분을 1회 일치 시키며 0~255 까지의 숫자 제한을 위한 중첩 하위 표현식을 추가함 |
8. 역참조
예문 <h1>text1</h1> <h2>text2</h2> |
정규표현식 - 역참조 <(h1)>.*?<\/\1> |
결과 <h1>text1</h1> <h2>text2</h2> |
설명 \1 을 사용하여 첫번째 하위표현식인 (h1) 을 재검색함. ※주: 역참조를 모든 정규표현식을 이용하는 애플리케이션에서 지원하는 것은 아니다. 하위표현식의 순서에 영향을 미치므로 번호 사용에 유의해야 한다. 중첩 하위표현식의 경우 ( 1번 ( 2번 ) ) ( 3번 ) 의 형태로 역참조 번호가 매겨진다. \0 은 표현식 전체 (적용 예 추후 업데이트 예정) |
예문 <h1>text1</h1> <h2>text2</h2> |
정규표현식 - 치환 검색: <(\/)?h1> , 치환: <$1h3> |
결과 <h3>text1</h3> <h2>text2</h2> |
설명 치환할 부분에서 변경되지 말아야 할 부분을 (\/) 하위표현식으로 표시하고, 치환부분에서 $1 로 재사용 |
9. 전방탐색, 후방탐색
예문 http형식은 다음과 같다. http://www.abc.com |
정규표현식 - 전방탐색 http(?=:) |
결과 http형식은 다음과 같다. http://www.abc.com |
설명 전방탐색은 하위표현식에 표시된 부분까지 찾되 찾은 부분의 앞까지만 검색영역으로 지정된다. http: 를 찾지만 검색된 영역은 http 가 된다. |
예문 value01: $11.10 value02: $40.00 |
정규표현식 - 후방탐색 (?<=\$)[\d.]+ |
결과 value01: $11.10 value02: $40.00 |
설명 후방탐색은 하위표현식에 표시된 부분까지 찾되 찾은 부분의 뒤까지만 검색영역으로 지정된다. $##.## 을 찾지만 검색된 영역은 ##.## 이 된다. |
전후방탐색 종류 | 설명 |
(?=) | 긍정형 전방탐색 (특정 어구를 포함시킬때 사용) |
(?!) | 부정형 전방탐색 (특정 어구를 제외할때 사용) |
(?<=) | 긍정형 후방탐색 (특정 어구를 포함시킬때 사용) |
(?<!) | 부정형 후방탐색 (특정 어구를 제외할때 사용) |
예문 내가 찾는 건 샘플A이다. 내가 찾는건 샘플B는 아니다.내가 찾는 건 샘플A이다. 내가 찾는건 샘플B는 아니다. 샘플A이다. 샘플B는 아니다. 내가 찾는 건 샘플A 내가 찾지 않는건 샘플B 샘플A 샘플B |
정규표현식 - 특정 어구 제외 ^((?!샘플B).)*$ or ^(.(?<!샘플B))*$ |
결과 내가 찾는 건 샘플A이다. 내가 찾는건 샘플B는 아니다. 샘플A이다. 샘플B는 아니다. 내가 찾는 건 샘플A 내가 찾지 않는건 샘플B 샘플A 샘플B |
설명 한 라인의 처음과 시작 중에 (^ ~ $) 전방탐색(+후방탐색)으로 특정문구(샘플B)가 들어가지 않은 것(?! or ?<!)을 찾고 그 외의 문자가 들어간 것 (.*) 을 찾아라. 해당 구문을 사용시 전방탐색(+후방탐색) 구문이 다음 . 메타 문자 전체를 하위표현식으로 묶어서 표현함에 주의해야 한다. 하위표현식으로 묶어 주지 않으면 제외되는 문자는 없는것으로 간주하여 모든 문장을 찾게 된다. |
10. 조건
예문 <a href="localhost"><img src="localhost" /></a> <img src="localhost" /> <a href="localhost"><img src="localhost" /> |
정규표현식 - 역참조 조건 (?(backreference)true) (<a .*?>)?<img .*?>(?(1)</a>) |
결과 <a href="localhost"><img src="localhost" /></a> <img src="localhost" /> <a href="localhost"><img src="localhost" /> |
설명 (?(1) ~) 를 사용하여 1번 하위표현식 조건이 일치할 경우 </a> 를 함께 찾는다. 역참조 조건 사용시 true 외에 false 를 사용하고자 하는 경우 (?(backreference)true|false) 와 같이 | 를 이용하여 false 부분을 지정하여 사용한다. |
11. AND
예문 오에스티 오티에스 |
정규표현식 - (?=조건1)(?=조건2).* (?=(^((?!오에스티).)*$))(?=(오|에스|티)).* |
결과 오에스티 오티에스 |
설명 특정어구를 제외하면서(조건1) 특정어구는 포함(조건2) 하는 방법 |
12. 기타 사례
- 추후 업데이트 예정 -
반응형