Regular Expression

GilLog·2020년 12월 29일
0

개념

목록 보기
9/19

🙆‍♂️ import 🙇‍♂️

정규표현식 (Regex) 정리[HAMA BLOG]

정규표현식 기초[컴퓨터를 누구보다 잘하고 싶은 Poqw]


Regular Expression ?

Regular Expression은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용되는 형식 언어이다.

정규표현식은 일반적으로 /로 감싸진 형태로 표현된다.

Regular Expression

표현식의미
.개행문자(\n)를 제외한 모든 문자와 일치한다.
\특별한 의미를 가진 문자를 이스케이프 시켜준다.
문자클래스가 시작되기 전에 사용되어야 한다.
[문자 클래스 시작
]문자 클래스 종료
(문자 그룹 시작
)문자 그룹 종료
+문자 그룹이나 바로 앞 문자가 한 번 이상 반복될 수 있다는 것을 의미
*문자 그룹이나 바로 앞 문자가 0번 혹은 그 이상 반복될 수 있다는 것을 의미
?문자 그룹이나 바로 앞 문자가 0번 혹은 한 번 반복될 수 있다는 것을 의미
앞 뒤의 문자그룹에 일치할 수 있다는 것을 의미
^문자열의 시작과 일치
$문자열의 끝과 일치
-문자열의 범위를 나타냄

문자 클래스, 문자 그룹

문자 클래스는 괄호 안에 여러 문자를 묶어 이들 중 '하나'를 의미한다.
EX] [a-z] = > 소문자 알파벳 중 하나를 의미하게 되어 a, b, c 등이 일치

문자 그룹은 괄호 안에 추출한 패턴표현을 그대로 지정한다.

EX] (a-z) = > a-z 만을 일치하게 된다. a, b, c 등은 불 일치

Regular Expression Meta 문자

정규 표현식에서 사용되는 기호를 Meta 문자라고 한다.

내부적으로 특정 의미를 가지는 문자들을 말하며 간단하게 정리하면 아래와 같다.

표현식의미
^x문자열의 시작을 표현하며 x 문자로 시작됨을 의미한다.
x$문자열의 종료를 표현하며 x 문자로 종료됨을 의미한다.
.x임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미한다.
x+반복을 표현하며 x 문자가 한번 이상 반복됨을 의미한다.
x?존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다.
x*반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다.
xㅣyor 를 표현하며 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 를 표현하며 ^ 를 문자로 사용함을 의미한다.
\bword boundary를 표현하며 문자와 공백사이의 문자를 의미한다.
\Bnon word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미한다.
\ddigit 를 표현하며 숫자를 의미한다.
\Dnon digit 를 표현하며 숫자가 아닌 것을 의미한다.
\sspace 를 표현하며 공백 문자를 의미한다.
\Snon space를 표현하며 공백 문자가 아닌 것을 의미한다.
\ttab 을 표현하며 탭 문자를 의미한다.
\vvertical tab을 표현하며 수직 탭(?) 문자를 의미한다.
\wword 를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미한다.
\Wnon word를 표현하며 알파벳 + 숫자 + _ 가 아닌 문자를 의미한다.

Flag

정규표현식에는 Flag 라는 것이 존재 한다.

Flag를 사용하지 않으면 문자열에 대해서 검색을 한번만 처리하고 종료하게 된다.

Flag의 목록은 아래와 같다.

Flag의미
gGlobal 의 표현하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다.
iIgnore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.
mMulti line을 표현하며 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다.

Greedy, Non-Greedy

정규표현식에는 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]/g

전체에서 0~9사이에 아무 숫자 '하나'를 매칭한다.

개발 문자 - /[to]/g

전체에서t, o 를 모두 매칭한다.

단어 - /filter/g

전체에서 f 따로 i 따로 찾는게 아니라 'filter' 라는 단어에 매칭되는것을 찾는다.

단어 제외 - /\b(?:(?!to)\w)+\b/g

전체에서 'to' 라는 단어를 빼고 다른 단어 매칭한다.
"Tutorial"도 제외된다.

단어 제외 - \b(?!\bto\b)\w+\b

전체에서 '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]?)-?([0-9]{3,4})-?([0-9]{4})$/

시작을 숫자 01로 시작하며, 그 후에 0,1,6,7,8,9 중에 하나가 나올수도 있으며,

하이픈 - 하나가 존재할수도 있으며, 숫자 3~4개 이어지고 ,또 하이픈 - 하나 존재할수도 있으며, 숫자 4개가 이어진다.

URL - ^(https?):\/\/([^:\/\s]+)(:([^\/]*))?((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$

profile
🚀 기록보단 길록을 20.10 ~ 22.02 ⭐ Move To : https://gil-log.github.io/

0개의 댓글