정규표현식 기초[컴퓨터를 누구보다 잘하고 싶은 Poqw]
Regular Expression
은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용되는 형식 언어이다.
정규표현식은 일반적으로 /
로 감싸진 형태로 표현된다.
표현식 | 의미 |
---|---|
. | 개행문자(\n)를 제외한 모든 문자와 일치한다. |
\ | 특별한 의미를 가진 문자를 이스케이프 시켜준다. 문자클래스가 시작되기 전에 사용되어야 한다. |
[ | 문자 클래스 시작 |
] | 문자 클래스 종료 |
( | 문자 그룹 시작 |
) | 문자 그룹 종료 |
+ | 문자 그룹이나 바로 앞 문자가 한 번 이상 반복될 수 있다는 것을 의미 |
* | 문자 그룹이나 바로 앞 문자가 0번 혹은 그 이상 반복될 수 있다는 것을 의미 |
? | 문자 그룹이나 바로 앞 문자가 0번 혹은 한 번 반복될 수 있다는 것을 의미 |
ㅣ | 앞 뒤의 문자그룹에 일치할 수 있다는 것을 의미 |
^ | 문자열의 시작과 일치 |
$ | 문자열의 끝과 일치 |
- | 문자열의 범위를 나타냄 |
문자 클래스
는 괄호 안에 여러 문자를 묶어 이들 중 '하나'를 의미한다.
EX] [a-z] = > 소문자 알파벳 중 하나를 의미하게 되어 a, b, c 등이 일치
문자 그룹
은 괄호 안에 추출한 패턴표현을 그대로 지정한다.
EX] (a-z) = > a-z 만을 일치하게 된다. a, b, c 등은 불 일치
정규 표현식에서 사용되는 기호를 Meta 문자
라고 한다.
내부적으로 특정 의미를 가지는 문자들을 말하며 간단하게 정리하면 아래와 같다.
표현식 | 의미 |
---|---|
^x | 문자열의 시작을 표현하며 x 문자로 시작됨을 의미한다. |
x$ | 문자열의 종료를 표현하며 x 문자로 종료됨을 의미한다. |
.x | 임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미한다. |
x+ | 반복을 표현하며 x 문자가 한번 이상 반복됨을 의미한다. |
x? | 존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다. |
x* | 반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다. |
xㅣy | or 를 표현하며 x 또는 y 문자가 존재함을 의미한다. |
(x) | 그룹을 표현하며 x 를 그룹으로 처리함을 의미한다. |
(x)(y) | 그룹들의 집합을 표현하며 앞에서 부터 순서대로 번호를 부여하여 관리하고 x, y 는 각 그룹의 데이터로 관리된다. |
(x)(?:y) | 그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음을 의미한다. |
x{n} | 반복을 표현하며 x 문자가 n번 반복됨을 의미한다. |
x{n,} | 반복을 표현하며 x 문자가 n번 이상 반복됨을 의미한다. |
x{n,m} | 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다. |
내부에서 Meta 문자
를 사용할 때 다른 의미를 가지고 동작 할 수도 있다.
아래는 특별한 용도로 사용되는 Meta 문자
이다.
표현식 | 의미 |
---|---|
[xy] | 문자 선택을 표현하며 x 와 y 중에 하나를 의미한다. |
[^xy] | not 을 표현하며 x 및 y 를 제외한 문자를 의미한다. |
[x-z] | range를 표현하며 x ~ z 사이의 문자를 의미한다. |
\^ | escape 를 표현하며 ^ 를 문자로 사용함을 의미한다. |
\b | word boundary를 표현하며 문자와 공백사이의 문자를 의미한다. |
\B | non word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미한다. |
\d | digit 를 표현하며 숫자를 의미한다. |
\D | non digit 를 표현하며 숫자가 아닌 것을 의미한다. |
\s | space 를 표현하며 공백 문자를 의미한다. |
\S | non space를 표현하며 공백 문자가 아닌 것을 의미한다. |
\t | tab 을 표현하며 탭 문자를 의미한다. |
\v | vertical tab을 표현하며 수직 탭(?) 문자를 의미한다. |
\w | word 를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미한다. |
\W | non word를 표현하며 알파벳 + 숫자 + _ 가 아닌 문자를 의미한다. |
정규표현식에는 Flag
라는 것이 존재 한다.
Flag
를 사용하지 않으면 문자열에 대해서 검색을 한번만 처리하고 종료하게 된다.
Flag
의 목록은 아래와 같다.
Flag | 의미 |
---|---|
g | Global 의 표현하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다. |
i | Ignore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다. |
m | Multi line을 표현하며 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다. |
정규표현식에는 Greedy(최대 패턴 일치)
, Non-Greedy(최소 패턴 일치)
가 존재하며, 기본적으로 Greedy를 적용한다.
Some<b>HTML</b> markup
<b>
, </b>
와 같은 HTML TAG만 걸러내고 싶어서<.*>
라는 정규표현식을 사용하게 되면 <b>HTML</b>
가 일치된다.
분명 <b>
, </b>
, <b>HTML</b>
모두 <.*>
와 일치하는 문자열인데,
<b>HTML</b>
만 일치되는 것은 Greedy
가 적용되었기 때문이다.
Non-Greedy
하게 <b>
나 </b>
를 일치 시키고 싶다면 반복을 의미하는 특수 표현( *, +, ? )
뒤에 ?
만 붙이면 된다.
즉, <.*?>
를 하게 되면 NOn가 적용되며 <b>
와 </b>
가 걸러진다.
전체에서 0~9사이에 아무 숫자 '하나'를 매칭한다.
전체에서t
, o
를 모두 매칭한다.
전체에서 f
따로 i
따로 찾는게 아니라 'filter' 라는 단어에 매칭되는것을 찾는다.
전체에서 'to' 라는 단어를 빼고 다른 단어 매칭한다.
"Tutorial"도 제외된다.
전체에서 'to' 라는 단어를 빼고 다른 단어 매칭한다.
"Tutorial"는 제외 안된다
/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
'시작을' 0~9 사이 숫자 or a-z A-Z 알바펫 아무거나로 시작하고,
중간에 - _ . 같은 문자가 있을수도 있고 없을수도 있으며,
그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 문자가 없거나 연달아 나올수 있으며,
@가 반드시 존재하고, 0-9a-zA-Z 여기서 하나가 있고, 중간에 - _ . 같은 문자가 있을수도 있고 없을수도 있으며,
그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 문자가 없거나 연달아 나올수 있으며,
반드시 . 이 존재하고, [a-zA-Z] 의 문자가 2개나 3개가 존재하는데 이 모든것은 대 소문자 구분하지않는다.
/^\d{3}-\d{3,4}-\d{4}$/
시작을 숫자 3개로하며, 중간에 하이픈 - 하나 존재, 숫자가 3~4개 존재하며, 하이픈 하나 존재, 숫자 4개로 끝난다.
시작을 숫자 01로 시작하며, 그 후에 0,1,6,7,8,9 중에 하나가 나올수도 있으며,
하이픈 - 하나가 존재할수도 있으며, 숫자 3~4개 이어지고 ,또 하이픈 - 하나 존재할수도 있으며, 숫자 4개가 이어진다.
^(https?):\/\/([^:\/\s]+)(:([^\/]*))?((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$