개발

정규표현식 정리 + 사례 연구

인공지능 대학생 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&nbsp;&nbsp;Chocolate
정규표현식 - 하위표현식 없을 시
&nbsp;{2,}
결과
ABC&nbsp;&nbsp;Chocolate
설명
{2,} 의 바로 앞에 있는 ; 를 2개 이상 찾게 됨. 전체 문자열을 묶기 위해 ( ) 를 사용해야 함
정규표현식 - 하위표현식 있을 시
(&nbsp;){2,}
결과
ABC&nbsp;&nbsp;Chocolate
설명
하위표현식 ( ) 로 묶은 부분을 전체 한문자로 취급하여 &nbsp; 의 {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. 기타 사례

- 추후 업데이트 예정 -

반응형