문법
metacharacters
대부분의 문법에서 regex는 14개의 metacharacters를 가지고 있다. {}[]()^$.|*+?\로, 이 문자들을 특별한 의미를 가진다. 개별 문자로 사용하려면 \를 앞에 붙여 escape해주어야 한다.
delimiter(구획 문자)
프로그래밍 언어에서는 문자열로 regex를 나타낼 수 있다. "re"처럼. /re/처럼 슬래시도 많이 쓴다. 이 구획 문자는 정규표현식에서 사용하려면 escape해주어야 한다.
기본 개념
or
세로줄은 or을 의미한다. 예를 들어 gray|grey는 "gray"또는 "grey"와 매치된다.
그룹화
괄호는 연산자의 범위 및 우선 순위를 결정하는데 사용된다. 예를 들어 gray|grey와 gr(a|e)y는 같은 패턴이다.
수량화(Quantification)
횟수 표시 문자(quantifier) | 설명 |
* | 이전 요소 0번 이상 반복 |
+ | 이전 요소 1번 이상 반복 |
? | 이전 요소 0또는 1회 |
{n} | 이전 요소 정확히 n회 반복. [2]{2} 라면 2가 2번 반복되는 문자를 뜻한다. |
{min,} | 이전 요소 min이상 반복 |
{,max} | 이전 요소 max이하 반복 |
{min, max} | 이전 요소 min이상 max이하 반복 [a]{2,4} 라면 aa, aaa, aaaa가 포함된다. |
*, +, {}뒤에 붙은 ? | 게으른 수량자로 동작한다. 보통 패턴을 만족하는 최대길이의 문자열을 찾지만, 게으른 수량자로 반복하면 패턴을 만족하는 최소길이의 문자열을 찾는다. |
POSIX 표준
metacharacter | 설명 |
^ | 시작 위치에 있는 문자열을 매치한다. |
. | 모든 싱글 문자를 매치한다(많은 앱이 newline을 제외하지만 포함하는 앱도 있다). bracket expression에서는 실제 .를 의미한다. |
[] | bracket expression. 괄호 안에 있는 하나의 캐릭터를 매치한다. -는 처음이나 마지막에 나오면 문자 그대로를 의미한다([abc-] 또는 [-abc]). ]는 처음 나오면 문자 그래도를 의미한다([]abc]). |
[^] | 괄호 안에 있는 문자가 아닌 하나의 캐릭터를 매치한다. |
$ | 문자열 또는 line의 마지막 위치를 매치한다. |
() | 하위 표현을 정의한다. |
\n | |
* | 이전 요소 0번 이상 반복을 매치 |
{m,n} | 이전 요소 m이상 n이하 반복 매치 |
POSIX 확장
metacharacter | 설명 |
? | 이전 요소 0또는 1회 매치 |
+ | 이전 요소 1번 이상 반복 매치 |
| | or |
Character classes (캐릭터 클래스)
Java | ASCII | 설명 |
\w | [A-Za-z0-9_] | 알파벳과 숫자와 _ |
\W | [^A-Za-z0-9_] | 알파벳과 숫자와 _ 가 아닌것 |
\d | [0-9] | 숫자 |
\D | [^0-9] | 숫자가 아닌것 |
\s | [ \t\r\n\v\f] | whitespace 문자들 |
\S | [^ \t\r\n\v\f] | whitespace 문자가 아닌것 |
\b | (?<=\W)(?=\w)|(?<=\w)(?=\W) | \w와 \W사이. 즉 문자와 문자가 아닌 것의 경계. 클래스로 사용하면 포함되지 않지만 ASCII로 사용하면 문자가 포함된다. |
\B | (?<=\W)(?=\W)|(?<=\w)(?=\w) | \w와 \w사이 또는 \W와 \W사이. 즉 단어 경계가 아닌 경계. 클래스로 사용하면 포함되지 않지만 ASCII로 사용하면 문자가 포함된다. |
정규가 아닌 언어(non-refular languages) 패턴
요즘 regex라이브러리는 regular languages를 넘는 힘을 나타낸다.
어떠한 것으로 시작하거나 어떠한 것으로 끝난다는 것을 지정할 때에는 다음의 패턴을 사용한다.
lookbehind와 lookahead라는 개념을 지원한다.
lookbehind는 '뒤돌아보다'라는 뜻. 즉 왼쪽을 검사한다.
lookahead는 '내다보다'라는 뜻. 즉 오른쪽을 검사한다.
pattern | type | matches | 포함검색 |
(?<=Y)X | Positive lookbehind | Y를 만족한다면, Y뒤에 있는 X | x |
(?=Y)X | Positive lookahead | Y를 만족한다면, X (Y뒤가 아니다) | o |
(?<!Y)X | Negative lookbehind | Y를 만족하지 않는다면, Y뒤에 있는 X | x |
(?!Y)X | Negative lookahead | Y를 만족하지 않는다면, X (Y뒤가 아니다) | o |
X(?<=Y) | Positive lookbehind | Y를 만족한다면, X (Y앞이 아니다) | o |
X(?=Y) | Positive lookahead | Y를 만족한다면, Y 앞에 있는 X | x |
X(?<!Y) | Negative lookbehind | Y를 만족하지 않는다면, X (Y앞이 아니다) | o |
X(?!Y) | Negative lookahead | Y를 만족하지 않는다면, Y앞에 있는 X | x |
쉽게 생각하자면 lookbehind의 왼쪽에 X라면 Y를 포함해 검색하는 것이고
lookbehind의 오른쪽에 X라면 Y를 제외하고 검색하는 것이다
lookahead의 왼쪽에 X라면 Y를 제외하고 검색하는 것이고
lookahead의 오른쪽에 X라면 Y를 포함해 검색하는 것이다.
예를 들어 "abcdefghijklmn"문자열이 있다고 했을 때 다음 패턴을 쓰면 매치되는 것이다.
pattern | 패턴 | 매치 |
(?<=Y)X | (?<=cd)ef | ef |
(?=Y)X | (?=cd)c | c |
(?<!Y)X | (?<!cd)f | f |
(?!Y)X | (?!cd)d | d |
X(?<=Y) | d(?<=cd) | d |
X(?=Y) | b(?=cd) | b |
X(? | e(?<!ef) | e |
X(?!Y) | c(?!ef) | c |
lookahead는 영문자와 숫자, 특수문자 하나씩은 필수 포함 같이 패스워드 조건에서 유용하게 사용 가능하다.
^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[`~!@#$%^&*()-_=+])[a-zA-Z0-9`~!@#$%^&*()-_=+]{8,20}$
=> 영어, 숫자, 특수문자가 하나씩은 포함되어야 하고 8~20글자 사이 조건이다
참고 : https://javascript.info/regexp-lookahead-lookbehind
https://en.wikipedia.org/wiki/Regular_expression
https://blog.outsider.ne.kr/141
https://blog.hexabrain.net/202
'web > javascript' 카테고리의 다른 글
youtube html에 삽입하기(youtube iframe_api) (0) | 2023.08.31 |
---|---|
JS Promise.all & Promise.race (0) | 2023.02.21 |
JS async & await (0) | 2023.02.20 |
JS Promise (0) | 2023.02.20 |
JavaScript - 동기(synchronous), 비동기(asynchronous) (0) | 2023.02.15 |