정규표현식

KJA·2022년 9월 19일
0

테스트 사이트

기본 메타 문자

.		모든 문자 일치
|		OR 왼쪽 문자(혹은 패턴) 혹은 오른쪽 문자(혹은 패턴)과 일치
[]		문자 집합 구성원 중 하나와 일치 ex) [abc] : a 혹은 b 혹은 c
[^]		문자 집합 구성원을 제외하고 일치, [^abc] : a, b, c 제외한 모든 문자
-		범위 정의 ([A-Z]와 같은 형태로 대문자 A에서 Z사이의 문자를 의미)
\		다음에 오는 문자를 이스케이프

수량자

*		앞의 문자나 부분식이 0개 이상 탐욕적으로 찾기
*?		탐욕적 수량자 *를 게으른(lazy) 수량자로 바꿔 찾기
+		앞의 문자나 부분식을 하나 이상 탐욕적으로 찾기
+?		탐욕적 수량자 +를 게으른(lazy) 수량자로 바꿔 찾기
?		앞의 문자나 부분식을 0개나 1개 찾기
{n}		앞의 문자나 부분식이 정확히 n번 일치하는 경우 찾기
{m,n}	앞의 문자나 부분식이 m번에서 n번 일치하는 경우 찾기
{n,}	앞의 문자나 부분식이 n번 이상인 경우를 탐욕적으로 찾기
{n,}?	탐욕적 수량자 {n,}를 게으른(lazy) 수량자로 바꿔 찾기

문자 하나가 아니라 조건에 해당하는 붙어있는 여러개의 문자를 찾는다는 것이 핵심이다. *, + 의 차이를 이해해야 한다.

  • *는 없는 경우가 포함되고
  • +는 무조건 하나는 있어야 한다는 의미다.

다음으로 탐욕적 수량자와 게으른 수량자를 이해해야 한다. 이 부분은 매우 중요하면서도 처음엔 어려울 수 있는 부분이다.

  • 탐욕적 수량자는 조건에 맞지 않을 때까지 하나의 패턴으로 인식하는 것
  • 게으른 수량자는 조건에 맞으면 욕심부리지 말고 거기서 끝내는 것

예제

abc*		ab 그리고 0개 이상의 c 를 포함한 문자열과 매칭합니다
abc+		ab 그리고 1개 이상의 c 를 포함한 문자열과 매칭합니다
abc?		ab 그리고 0개 또는 1개의 c 를 포함한 문자열과 매칭합니다 
abc{2}		ab 그리고 2개의 c 를 포함한 문자열과 매칭합니다  
abc{2,}		ab 그리고 2개 이상의 c 를 포함한 문자열과 매칭합니다
abc{2,5}	ab 그리고 2개 이상 5개 이하의 c 를 포함한 문자열과 매칭합니다
a(bc)*		a 그리고 0개 이상의 bc를 포함한 문자열과 매칭합니다
a(bc){2,5}	a 그리고 2개 이상 5개 이하의 bc를 포함한 문자열과 매칭합니다

위치 지정

^	입력 문자열의 시작에서 그 다음 나오는 문자나 부분식과 일치하는지 검사
$	문자열의 끝과 일치
\b	단어 경계(단어와 공백 사이의 위치)와 일치
	ex) 'st\b'는 "test"의 st는 찾지만, "tester"의 st는 찾지 않음
	* test test에서 test 사이의 빈공간인 space와는 다른 의미
\B	\b와 반대(비단어 경계)로 일치. 즉 "\b"의 예제의 반대 결과가 나옴

특수한 문자

하나하나 [] 안에 넣어주어야 하는 문자들을 미리 정의해둔 것으로 이해하면 된다.

\d		모든 숫자와 일치. [0-9]와 동일
\D		\d와 반대. [^0-9]와 동일
\w		영숫자 문자나 밑줄과 일치. [a-zA-Z0-9_]와 동일
\W		\w와 반대로 일치. [^a-zA-Z0-9_]와 동일
\s		공백, 택, 용지 공급 등과 같은 문자 찾기. [\f\n\r\t\v]
\S		\s와 반대로 일치. [^\f\n\r\t\v]
\f		용지 공급 문자 찾기. 페이지 넘기기(formfeed) = \x0a, \cL
\n		줄 바꿈 문자 찾기. \x0a, \cJ
\r		캐리지 리턴. \x0d, \cM
\t		탭 문자 찾기. \x09, \cI
\v		세로 탭 문자 찾기. \x0b, \cK
\xn		n으로 표시된 16진수 이스케이프 값과 일치. 16진수는 정확히 2자리여야 함
\0n		n으로 표시된 8진수 숫자와 일치. 가급적 사용하지 않는 것이 좋음

특수문자(^.[$()|*+?{\)를 문자 그대로 사용하려면, 역슬래쉬\를 앞에 붙여야한다.

\$\d	$ 문자 그리고 숫자 하나와 매칭합니다

출력이 불가능한 탭문자\t, 줄바꿈문자\n, 캐리지리턴문자\r 또한 매칭할 수 있다.

역참조와 전후방탐색

(pattern)			하위 표현식 정의. 패턴을 찾아 일치하는 항목을 캡처하는 부분식. 
					가로 자체 '('나')'를 찾고 싶으면 '\'를 붙여 이스케이프하면 된다. '\(', '\)' 
\1					첫 번째 일치한 하위 표현식, 두 번째 일치한 하위 표현식은 \2로 표기
(?=pattern)			전방탐색
(?!pattern)			부정형 전방탐색
?(BR)true			조건 지정
?(BR)true|false		else 표현식 조건 지정

()[]는 전혀 다른 의미라는 사실을 머리에 각인해야 한다. 이 파트가 정규표현식에서 가장 어려운 부분이며 프로그래밍 할 때 가장 많이 사용되는 부분이기도 하다. 

가로로 묶은 하위 표현식은 역참조 시 사용하기도 하지만, 프로그래밍에서는 하위표현식에 해당하는 문자열을 배열이나 그룹으로 따로 제공해 주기 때문에 유용하게 사용할 수 있다.

대소문자 변환

\E		\L 혹은 \U 변환을 끝냄
\I		다음에 오는 글자를 소문자로 변환
\L		\E를 만날 때까지 모든 문자를 소문자로 변환
\u		다음에 오는 글자를 대문자로 변환
\U		\E를 만날 때까지 모든 문자를 대문자로 변환

옵션

정규식은 보통 /abc/와 같은 형식을 사용하며, 두개의 슬래쉬 문자/ 사이에 정규식을 작성합니다. 두 번째 슬래쉬 뒤에 플래그를 사용할 수 있습니다.

  • g(global) : 문자열에서 첫번째 매칭 후, 끝나지 않고 매칭되는 모든 항목을 찾습니다
  • m(multi-line) : anchor(^ 또는 $)가 문자열 전체가 아닌, 줄 각각에 매칭하여 줄별로 정규식 패턴을 매칭시킬 수 있습니다
  • i(insensitive) : 대소문자 구분을 무시하고 매칭합니다(예를 들어, /aBc/i는 AbC를 매칭합니다)

기본 예제

abc				abc가 있는 것
^abc			abc로 시작하는 것
abc$			abc로 끝나는 것
^abc$			abc로 시작하고 끝나는 것
[abc]			a,b,c 전부 중 하나를 포함한 경우
[a-z]			a에서 z 중 하나를 포함한 경우
^[0-9]			숫자 0-9 중 하나로 시작하는 패턴을 찾는 것
[^0-9]			숫자가 들어있지 않은 패턴을 찾는 것
^[^0-9]			숫자가 들어있지 않은 문자로 시작하는 패턴을 찾는 것
a{3}			a의 3번 반복인 a인 것
a{3,}			a가 3번 이상 반복인 것
[0-9]{2}		두자리 숫자
abc[7-9]{2}		abc를 포함하고 7-9까지 숫자 중 2자리가 포함하는 것

자주 사용하는 정규식

이메일				/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/

이메일 체크			/^([A-Za-z0-9]|[\-]|[\_]){2,20}$/g
					숫자, 영어, _, - 외 입력 제한
                
특수문자 포함 체크		/[^\w\s]/i

집전화번호			/^(070|02|031|032|033|041|042|043|051|052|053|054|055|061|062|
063|064)-\d{3,4}-\d{4}$/u

휴대폰번호			/^(010|011|016|017|018|019)-\d{3,4}-\d{4}$/u

우편번호				/^\d{3}-?\d{3}$/u

아이디				/^[a-zA-Z]\w{2,7}$/u

주민등록번호			/^\d{2}[0-1]\d[0-3]\d-?[1-6]\d{6}$/u

복수 공백			/\s{2,}/

https://chrisjune-13837.medium.com/%EC%A0%95%EA%B7%9C%EC%8B%9D-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-%EC%98%88%EC%A0%9C%EB%A5%BC-%ED%86%B5%ED%95%9C-cheatsheet-%EB%B2%88%EC%97%AD-61c3099cdca8

https://myeonguni.tistory.com/1555

0개의 댓글