정규표현식 Regex 정리노트
Regex101
정규표현식을 연습해 볼 수 있는 사이트 : 링크
집합
[abc]
a 혹은 b 혹은 c
[a-z]
a~z까지의 모든 소문자 (아스키 코드 기준)
[^A-Z]
A-Z까지의 모든 대문자를 제외한 다른 모든 문자
- ^는 반드시 집합 처음에 써야 한다.
문자 클래스
의미 | 집합 표현 | 문자 클래스 |
---|---|---|
숫자 | [0-9] | \d |
영어 대소문자 + 숫자 + _(언더바) | [a-zA-Z0-9_] | \w |
공백 문자 | [ \t\n\r\f\v] | \s |
\d
는 모든 숫자를 나타내는 집합([0-9]
)의 예약어이다.
\w
는 영어 대소문자, 숫자, 언더바(_
)를 선택한다. 특수 문자는 포함하지 않지만 언더바는 많은 경우 문자열의 구분자로 사용되기 때문에 함께 선택된다. (한글 선택 안됨)
\s
는 공백을 나타낸다. 스페이스 바, 탭 등 문자와 문자 사이를 구분 짓는 공백은 모두 선택된다.
문자 클래스(부정)
의미 | 집합 표현 | 문자 클래스 |
---|---|---|
숫자가 아닌 것 | [^0-9] | \D |
영어 대소문자 + 숫자 + _(밑줄) 아닌 것 | [^a-zA-Z0-9_] | \W |
공백 문자가 아닌 것 | [^ \t\n\r\f\v] | \S |
긍정을 대문자로 치환하면 부정이 된다.
메타문자 - Dot(.)
정규 표현식은 단순히 문자 표현 그대로를 검색하는 것뿐만 아니라, 문자열의 특정한 규칙을 표현하기 위해서 사용되기도 합니다. 이를 위해 만들어진 것이 바로 메타 문자입니다.
메타 문자는 문자열의 특정한 규칙을 좀 더 쉽게 표현할 수 있도록 만들어진 예약어입니다. 프로그래밍 언어에서
if
가 조건에 따라 다른 명령어를 실행해 주는 예약어인 것처럼, 메타 문자는 정규 표현식에서 원하는 방식으로 규칙을 찾게 해주는 예약어입니다.-출처 : 코드잇-
- [], -, ^도 모두 메타 문자에 속한다.
- 정규 표현식에서 일반적으로 많이 사용되는 메타 문자 중 하나가 바로 Dot(
.
)이다. Dot은 ‘모든 문자’를 의미한다. - Dot(.)은 모든 문자를 의미하지만 딱 한가지 줄바꿈 문자(
\n
)는 포함하지 않는다.- 그러나 플래그 설정에서 s를 주면 줄바꿈 문자도 포함함.
이스케이핑()
- 특수한 문자를 표현하고 싶을 때 사용한다.
- 예로 집합(
[]
)에서 α-β를 α에서 β 까지의 모든 문자가 아닌, α, -, 그리고 β의 집합으로 표현하고 싶다면,[α\-β]
라고 표현한다.\.
\/
//
\\
수량자
기본 형태는 반복하고 싶은 문자{수량자}
- 네 자리 숫자를 정규표현식으로 표현하려면?
[0123456789][0123456789][0123456789][0123456789]
[0-9][0-9][0-9][0-9]
[0-9]{4}
← 수량자 사용\d{4}
- 수량자는 범위를 지정할 수 있다.
{min, max}
로 지정함.\d{2,4}
는 숫자 2자리 ~ 4자리를 모두 선택\d{2,}
처럼 생략하면 2 이상인 모든 자리를 선택
수량자 메타 문자
+
,*
- 오토마타와 컴파일러 강의에서 배웠듯,
+
는 1 이상의 개수를 포함하고,*
는 0개여도 포함해준다.
- 오토마타와 컴파일러 강의에서 배웠듯,
?
?
는 문자가 아예 없거나 하나만 있는 경우 선택해준다.- 예시)
jpe?g
는 jpg와 jpeg를 모두 선택해준다.
탐욕적 수량자와 게으른 수량자
".*"
정규 표현식은 “(큰따옴표)를 포함하여 안에 있는 것들을 함께 선택해준다.- “Apple” “Banana” “Cake” 에 위 정규 표현식을 적용할 경우, 전체가 다 선택되는데, 이는
Apple" "Banana" "Cake
라는 큰 덩어리를 “” 안에 있다고 간주하기 때문. 이처럼 큰 덩어리를 찾는 수량자를 탐욕적 수량자라고 한다. - 이때
?
를 사용하면 작은 덩어리를 우선으로 탐색하는데,?
를 사용한 수량자를 게으른 수량자라고 한다.?
는 단독으로 사용될 때는 0 또는 1의 값을 탐색하지만, 다른 수량자와 함께 사용될 경우 게으른 수량자로 만들어 준다.
- “Apple” “Banana” “Cake” 에 위 정규 표현식을 적용할 경우, 전체가 다 선택되는데, 이는
경계
-
This island is beautiful
이라는 문장에서This
의is
나island
의is
말고 동사is
만 추출하고 싶다면, 경계라는 개념이 필요하다. -
경계를 나타내는 메타 문자는
\b
,\B
가 있다.\b
는 문자와 문자가 아닌 곳 사이의 위치를 의미하고,\B
는 문자와 문자 사이의 위치를 의미한다. -
따라서
\bis\b
정규 표현식은 동사is
를 탐색한다. -
\Bis\b
정규 표현식은This
의is
를 탐색한다. -
\bis\B
정규 표현식은island
의is
를 탐색한다.
하위 표현식
전체 정규 표현식 안에서 특정 패턴을 나타내는 표현식을 하나의 항목으로 처리하는 것을 하위 표현식이라고 한다. 메타 문자 소괄호(( )
)를 사용해 나타낸다. 하위 표현식을 사용하는 이유는 다음과 같다.
-
가독성
정규식이 복잡해지면 가독성이 많이 떨어지는데, 복잡한 정규 표현식을 하위 표현식으로 잘게 나누어 사용하면 가독성을 높일 수 있다. 예를 들어서, 핸드폰 번호를 표현하는 정규 표현식을 만들 때
010-\d{3,4}-\d{4}
보다는(010)-(\d{3,4})-(\d{4})
가 좀 더 의미를 직관적으로 이해하기 쉽다. -
표현식의 반복
ip 주소 같은 경우,
\d{1,3}\.
의 반복으로 이루어 지는데, 이를 소괄호로 감싸서 반복시킬 수 있다.(\d{1,3}\.){3}\d{1,3}
은 .(\.
)이 이후에 오는 숫자 13자리가 세 번 등장한 뒤, 다시 숫자 13자리가 등장하는 문자열을 탐색한다. -
OR(
|
) 연산 활용하위 표현식(
()
)안에는 OR(|
)연산자를 사용할 수 있다.예컨대, 1900년대와 2000년대를 함께 선택한다고 하면,
(19|20)\d{2}
와 같은 식으로 표기할 수 있다.
플래그
플래그는 정규 표현식에 적용되는 설정을 조정해 주는 옵션이다. 보통은 정규 표현식이 종료되는 지점에 사용된 슬래시(/
) 뒤쪽에 작성해 준다. 특정 의미를 가진 알파벳을 해당 위치에 적어주면 그 옵션에 맞는 설정으로 정규 표현식이 적용된다.
g
플래그는 일치하는 패턴 하나가 아닌 여러개를 찾는다.g
플래그가 없다면 가장 먼저 일치하는 패턴 하나만 검출된다.i
플래그는 대소문자 구별을 하지 않게 해준다.m
플래그는 문장의 끝에 줄바꿈이 오는 것을 허용한다. 원래는 줄바꿈기호가 있어도 문장이 끝났다고 치지 않는다.s
플래그는 Dot(.
)이 줄바꿈 문자도 포함하도록 설정한다.
역참조
- 역참조는 이전에 하위표현식으로 사용된 부분을 재사용 할 때 유용하다.
\1
\2
\3
… 처럼 사용하며, 왼쪽부터 오른쪽 순으로 하위표현식으로 표현된 순서에 해당하는 넘버링이 부여된다.
- 사용하는 프로그래밍 언어에 따라
\1
\2
로 표현될 수도 있고$1
$2
로 표현될 수도 있다. (JS는\
를 사용한다) <h1>invalid tag</h3>
처럼 잘못된 HTML태그를 알아보는데 사용할 수 있다.<h(\d+)>.*<\/h\1>
는 올바른 h태그를 검출한다.
전방탐색과 후방탐색
전방탐색과 후방탐색은 조건에 맞는 문자열 중 일부만 추출하고 싶을때 사용한다.
예를 들어, 전화번호 010-xxxx-yyyy에서 전화번호 포맷에 일치하는 전화번호들 중 마지막 4자리만 알고 싶다거나 중간 4자리만 알고 싶을 때 사용할 수 있다.
- 전방탐색은
(?= )
형태로 사용할 수 있다.(010)-(\d{4})(?=-\d{4})
는010-1234-5678
에서010-1234
만 검출한다.
- 후방탐색은
(?<= )
형태로 사용할 수 있다.(?<=010-)(\d{4})-(\d{4})
는010-1234-5678
에서1234-5678
만 검출한다.
- 둘 다 사용하는 경우
(?<=010-)(\d{4})(?=-\d{4})
는010-1234-5678
에서1234
만 검출한다.
부정 전방탐색과 부정 후방탐색
- 부정 전방탐색과 부정 후방탐색은 각각
(?! )
(?<!)
형태로 사용된다. - 전방탐색과 후방탐색이 일치하는 조건으로 활용되었다면 부정 전방탐색/후방탐색은 해당 탐색문이 일치하지 않는 경우 추출해온다.
[가-힣]{2}:(?![34])
는철수:20 영희:30
에서 철수만 검출한다.