정규표현식(Regular Expression)
- 실제 값은 다르지만 패턴은 서로 동일한 문자열을 표현할 때 사용되는 형식 언어
- 개발이나 데이터 분석에서 다양하게 활용
0. 실습환경
regex101
- FLAVOR
어떤 프로그래밍 언어 기반으로할지 등을 설정
(학습 환경은 ECMAScript(JavaScript) 기준)
- TEST STRING
실습할 텍스트 본문 입력하는 곳
- REGULAR EXPRESSION
원하는 정규식을 작성하는곳. 이곳에 정규 표현식을 작성하면 TEST STRING에 입력된 문자열 중 해당 정규 표현식에 일치하는 부분 하이라이트
- EXPLANATION
사용자가 입력한 정규 표현식을 해석한 내용을 보여줌
- MATCH INFORMATION
필요한 정규 표현식 문법으 검색하고 찾아볼 수 있음
1. 기본 문법
정규 표현식으로 하나의 문자 또는 단어를 찾기 위해선 그 문자를 그대로 입력해주면 된다.
1) 집합
집합이란?
- 표현하고 싶은 문자를 대괄호에 넣는 식으로 사용
- 대괄호 안에 들어간 문자들은 or 연산이 적용되어 집합 안에 있는 문자 중 하나라도 매칭되면 선택
// ex1. 집합을 이용해서 bar, var, ear 를 선택하기!
[bce]ar
// ex2. 숫자만 선택하기!
[0123456789]
// ex3. 알파멧만 선택하기!
[ABCDEFGHIJKLMNOPQRSTUVWXYZ][abcdefghijklmnopqrstuvwxyz]
// ex3-2. 대소문자 구분할 필요 없는 경우, Flag 사용```
- 플래그는 정규 표현식에 적용되는 설정을 조절해주는 옵션
- regex101에는 기본적으로 gm 플래그가 설정되어 있음
- g: 패턴과 일치하는 모든 것을 찾는다.
- i: 대소문자 구분 없이 찾는다.
- m: 정규 표현식은 전체 문자열을 하나의 문작으로 인식한다. 보통 사람이 줄 바꿈 문자를 기준으로 문장을 나누 듯 정규 표현식에도 문자열을 여러 줄로 인식하도록 하기 위해선 m(multiline)플래그가 필요하다.
하이픈과 캐럿
-
하이픈 : 문자들을 범위로 지정해서 사용
숫자 : [0-9]
영어 : [a-z][A-Z]
한글 : [가-힣]
숫자와 영어대문자 : [0-9A-Z]
-
하이픈 사용시 주의사항
아스키 코드를 기준으로 범위를 계산하기 때문에 [A-z]라고 명시하면 원하지 않는 단어도 선택된다.
-
캐럿 : 집합 안의 특정 문자를 제외하여 선택하고 싶을 때 사용
숫자만 제외 : [^0-9]
-
캐럿 사용시 주의사항
캐럿은 집합 안에 있는 모든 문자를 제외시킨다.
또 부정의 의미로 사용할 때는 집합에 가장 처음에 위치해야한다.
// ex4. 이름 나이(숫자) 자료구조에서 이름과, 30대만 선택하기
[가-힣][가-힣] [34][0-9]```
2) 문자 클래스
- 자주 사용하는 집합들을 좀 더 쉽게 사용할 수 있도록 한 일종의 예약어
- 보통 백슬러시 뒤에 특정 알파벳을 합쳐서 표기
숫자 : \d
영어 대소문자 + 숫자 + 언더바 : \w
공백문자 : \s
숫자가 아닌 것 : \D
영어 대소문자 + 숫자 + 언더바 아닌 것 : \W
공백 문자가 아닌 것 : \S
(조건1) ID에는 알파벳 소문자(a-z), 대문자(A-Z), 숫자(0-9)를 사용할 수 있습니다.
(조건2) 특수 문자는 사용이 안되지만 $, -, +, _만 예외적으로 사용이 가능합니다.
(조건3) 예외적으로 사용 가능한 특수문자를 제외한 특수문자가 사용되었거나, 공백이 들어간 경우는 ID 생성이 되지 않습니다.
[^\w$+\n-]```
3) 메타 문자
- 문자열의 특정한 규칙을 좀 더 쉽게 표현할 수 있도록 만들어진 예약어
- 정규 표현식에서 원하는 방식으로 규칙을 찾게 해주는 예약어
- 대괄호, 하이픈, 캐럿 모두 메타문자
Dot(.) : 모든 문자 의미
butDot(.)도 \n 개행 문자는 표현하지 못한다.
(Flag s 옵선을 추가하면 개행문자도 포함할 수 있다.)
h.```
4) 이스케이핑()
- 대괄호, 캐럿, Dot 등의 문자를 메타 문자가 아니라 일반 문자로 사용하고 싶을 때 사용
\.```
5) 수량자
- 문자의 반복 횟수를 설정하는 문법 -> 반복하고 싶은 문자{수량자}
- 반복하고 싶은 문자 부분에는 일반 문자, 집합, 문자 클래스, 메타 문자, 하위 표현식 가능
수량자 기본표현 : {n}
수량자 범위 지정 : {min, max}
수량자 메타 문자(*) : 제한 없이 모든 숫자, 앞에 문자가 하나도 없어도 선택
수량자 메타 문자(+) : 제한 없이 모든 숫자, 최소 1개 문자 반드시 필요
수량자 메타 문자(?) : 문자가 아예 없거나 하나만 있을 경우 선택
ex8. 숫자가 4번씩 반복되는 경우 선택
[0-9][0-9][0-9][0-9]
\d\d\d\d
\d{4}
ex9. 숫자가 3개 이상인 경우 선택
\d{3,}
ex10. 얼마가 오든 선택
\d+원```
탐욕적 수량자(*,+,{min})
- 정규 표현식에 부합하는 여러 케이스가 있을 때 가장 큰 덩어리의 문자열을 선택해 버리는 수량자
게으른 수량자(?)
- 문자를 원하는 만큼만 일치시키기 위해 사용하는 수량자
- ?는 단독으로 쓰일땐 0번 또는 1번 반복되는 문자를 찾는 수량자였다.
- 하지만 다른 수량자와 중첩해서 사용하면 앞에온 수량자가 게으른 수량자가 된다.
6) 경계
- 경계가 필요한 이유 : This is island에서 is만 선택하고 싶은데 This나 island에 포함된 is까지 선택됨
단어 경계
문자와 문자가 아닌 곳 사이의 위치를 나타내는 메타 문자 : \b
단어의 경계가 아닌 위치를 나타내는 메타 문자 : \B
\bis\b
ex12. This를 선택하고 싶은 경우
\Bis\b
ex13. island를 선택하고 싶은 경우
\bis\B```
문장 경계
- 문장 시작점을 나타내는 캐럿(^)과 문장 끝 지점을 나타내는 달러 기호($)를 사용해 단어가 아닌 문장의 경계 나타낼 수 있다.
- 캐럿(^)은 집합 안에서 쓰이면 부정이지만 집합 밖에서 쓰이면 경계의 의미를 갖게 된다.
- 참고로 플래그 옵션중 m을 추가한 경우와 하지 않은 경우 결과가 다르다.
(m은 줄바꿈을 문장 경계의 기준으로 허용하는지 여부를 나타내는 옵션이다.)
7) 하위 표현식
- 전체 정규 표현식 안에서 특정 패턴을 나타내는 표현식을 하나의 항목으로 처리하는 것
- 메타 문자 소괄호를 사용해 나타낸다.
가독성이 좋다. (010)-(\d{3,4})-(\d{4})
반복하기 좋다. (\d{1,3}.){3}\d{1,3}
OR(|) 연산 활용하기 좋다. (19|20)\d{2}
8) 플래그 옵션
- g : 정규 표현식은 일치하는 패턴 하나를 찾으면 그대로 종료, 하지만 플래그 g 사용하면 일치하는 모든 부분 선택
- i : 정규 표현식은 기본적으로 대소문자를 구분, 그래서 소문자 this로는 대문자 This를 선택할 수 없지만, 플래그 i를 사용하면 대소문자 구분 없이 알파벳이 일치하면 선택
- m : 원래는 문장의 처음과 끝만 경계의 기준이 되지만, 플래그 m을 설정해 주면 줄 바꿈이 된 곳을 문장의 경계로 인식 가능
- s : 모든 문자와 매칭하는 메타 문자 Dot이 줄 바꿈 문자(\n) 도 포함하도록 설정하는 플래그, 플래그를 사용하지 않으면 줄 바꿈이 되기 전까지만 인식이 됐는데, 플래그 s를 설정하니 모든 문자가 전부 다 선택
2. 심화 문법
1) 역참조
''' ex14. 앞에서 한 번 사용된 단어가 반복해서 나온 경우를 참조하고 싶은 경우
(\w+)\s\1 '''
\w를 하위 표현식으로 만들어준 뒤
공백을 나타내는 메타문자 \s 뒤에
\1이라는 형태로 역참조
하위 표현식이 여러개인 경우에는 괄호의 순서에 따라 왼쪽에서 오른쪽으로 자동으로 번호가 매겨지는데 이 번호를 통해 원하는 하위 표현식을 역참조 할 수 있다.
주의할 점은 프로그래밍 언어에 따라 $1, $2, \1, \2와 같이 역참조를 표현하는 기호가 다르다.
2) 치환
- 위에서 배운 정규 표현식의 문법들은 대부분 검색 목적으로 활용된다.
- 치환은 특정 문자 패턴과 일치하는 문자열을 찾아서 문자를 바꾸는 역할을 한다.
1) 바꿀 문자열을 정교 표현식으로 표현하고,
2) 바꾸고 싶은 문자열을 FUNCTION - Substitution 부분에 작성하면 된다.
3) 전방 탐색과 후방 탐색
- 전방 탐색과 후방탐색은 하위 표현식이지만 결과에는 반영되지 않고 특정 문자열을 찾기 위한 조건 역할만 하는 문법
- 문자열을 찾기 위한 패턴의 일부가 되지만 해당 정규 표현식으로 찾아지는 문자열 결과에는 반영되지 않는 하위 표현식
전방탐색 (lookahead)
-
문자열의 앞부분 부터 탐색하여 조건에 해당하는 부분이 확인 되면 해당 조건 뒤쪽의 부분을 생락하기 위해 사용 -> (?= )
-
(ex15.) (010)-(\d{4})까지 일치하면서 뒤에 4자리 숫자가 오는 문자열을 찾아서 앞에 세 자리 숫자와 가운데 네 자리 숫자, 그리고 그 사이의 하이픈만을 선택하는 정규 표현식
후방탐색 (lookbehind)
부정 전방탐색과 부정 후방탐색
부정 전방탐색 : (?! )
부정 후방탐색 : (?<! )