[정규표현식(Regular Expression) 정리] - 2. 메타 문자와 수량 한정자와 플래그

728x90
반응형

2021.12.02 - [SW/Reference] - [정규표현식(Regular Expression) 정리] - 1. 기본 개념

 

[정규표현식(Regular Expression) 정리] - 1. 기본 개념

1. 서두 필자가 여러 블로그, 책을 더듬어가며 정리한 정규식 문법에 대한 포스팅이다. 내용이 길어질 예정이라 챕터별로 나누어 포스팅하도록 하겠다. 2. 정규표현식(Regular Expression) 이란? 기본

betaman-workshop.tistory.com

정규표현식에 대해 처음 들어보거나 기초적인 컨셉 및 구조에 대해 모르고 있다면 필자의 이전글을 보고오길 바란다.


정규표현식 Regular Expression

1. 서두

이번 포스팅에서는 정규표현식에서 사용되는 "메타문자""수량한정자"와 "플래그"에 대해 설명할 예정이다.

(본 포스팅 시리즈는 Javascript 문법 내에서 사용되는 표준을 가져와 설명 중이다. 다른 언어도 크게 다르진 않는데 언어마다 사용성이 조금씩 다르기 때문에 다른언어에서 사용시엔 해당 언어의 정규표현식 사용법을 참고하여 사용하기 바란다.)

2. 메타문자란?

메타문자란, 정규표현식 내에서 특별한 용도로 사용되는 문자를 말한다.
수량한정자는 이 메타문자 중에 문자나 식이 나타나는 개수를 표현하는 문자를 말한다. 수량한정자도 메타문자의 일종이다.

.  ^  $  *  +  ?  {  }  [  ]  \  |  (  )

위 문자들이 메타문자들이다.

3. 메타문자 종류 및 용법

메타문자 기능 설명
^ 문자열의 시작 문자열이나 행의 처음을 의미한다.

예) /^hello/ : 문자열 맨 처음에 나오는 "hello"를 의미 한다. 맨 처음에 나오는 "hello"가 아니라면 이 패턴에 일치하지 않는다.
$ 문자열의 끝 문자열의 끝이나 행의 끝을 의미한다.

예) /hello$/ : 문자열 맨 끝에 나오는 "hello"를 의미 한다. 맨 끝에 나오는 "hello"가 아니라면 이 패턴에 일치하지 않는다.
. 임의의 문자 어떤 임의의 문자 1개를 의미한다.

예) /^.y$/ : 어떤 임의의 문자 1개와 y가 결합된 문자열의 패턴이다. 이 패턴에 일치하는 문자열은 "my", "by", "ny", "py"가 있다.
|

(알파벳 L 아님, vertical-bar)
선택 여러 문자나 식 중에 하나를 선택한다.

예) /^abc|adc$/: "abc"와 "adc"가 모두 이 패턴에 일치한다.
( ) 하위 표현식 (그룹) 여러 문자나 식을 하나로 묶을 수 있다.

예) /^abc|adc$/ 와 /^a(b|d)c$/ 는 같은 의미이다.
[ ] 문자 클래스 "["과 "]" 사이의 문자 중 하나를 선택한다. "|"을 여러 번 사용하는 것과 같은 의미이다.

예) /^hello[abc]$/ 와 /^hello(a|b|c)$/ 는 같은 의미이다.

또한 "-"(하이픈) 기호와 함께 쓰면 범위를 지정할 수 있다.

[a-z] : a부터 z까지 중 하나
[A-Z] : A부터 Z까지 중 하나
[1-9] : 1부터 9까지 중 하나
[ㄱ-ㅎ|ㅏ-ㅣ|가-힣] : 한글 문자 중 하나

예) /^[AD-HZ]$/ 와 /^[ADEFGHZ]$/ 는 같은 의미이다.
[^ ] 부정(not) 문자 클래스 안의 문자를 제외한 나머지를 선택한다.

예) /^[^abc]d$/ 는 "ad", "bd", "cd"를 제외한 "dd", "ed", "fd" 등을 포함한다.
\t 가로 탭 (TAB) white-space 문자중 하나이다.
\v 세로 탭 (VT) white-space 문자중 하나이다.
\n 개행문자 (LF) white-space 문자중 하나이다.
\r 캐리지리턴 (CR) white-space 문자중 하나이다.
\f 폼 피드 (FF) white-space 문자중 하나이다.
\d 모든 숫자 [0-9]와 동일하다.
\D 모든 숫자를 제외한
모든 것
[^0-9]와 동일하다.
\s 모든 white-space 문자 [ \t\v\n\r\f]와 동일하다. 맨 앞의 빈 칸은 공백문자
(space)를 의미한다.
\S 모든 white-space 문자를 제외한 모든 것 [^ \t\v\n\r\f]와 동일하다.
\w 모든 숫자와 문자와 언더바(_) [0-9a-zA-Z]와 동일하다.
\W 모든 숫자와 문자와 언더바(_)를 제외한 모든것 [^0-9a-zA-Z]와 동일하다.
\A 멀티라인 문자열의 시작 "^"과 비슷하게 문자열의 시작을 의미하는데, 플래그 "m"을 통해 활성화한 멀티라인 옵션에서는 "^"는 각 줄의 문자열의 시작을 의미하지만 "\A"는 줄과 상관없이 전체 문자열의 시작을 의미한다.
\Z 멀티라인 문자열의 끝 "$"과 비슷하게 문자열의 끝을 의미하는데, 플래그 "m"을 통해 활성화한 멀티라인 옵션에서는 "$"는 각 줄의 문자열의 끝을 의미하지만 "\Z"는 줄과 상관없이 전체 문자열의 끝을 의미한다.
\b 단어구분자
(단어의 경계인 것)
단어 경계를 의미한다. 단어의 경계란 다른 '단어 문자'가 앞이나 뒤에 등장하지 않는 위치를 의미한다. 단어 경계는 검색 결과에 포함되지 않는다.

예)
/\bm/ 는 "moon"이라는 문자열에서 "m"을 결과로 나타낸다.
/oon\b/ 는 "moon" 이라는 문자열에서 "oon"을 결과로 나낸다.
/oo\b/ 는 "moon" 이라는 문자열에서 아무것도 결과로 나타내지 않는다. 왜냐하면 "oo" 뒤에 단어경계가 아닌 "n"이 붙기 때문이다.
\B 부정형 단어구분자
(단어의 경계가 아닌 것)
\b의 반대로 단어 경계가 아닌 것을 의미한다.

예)
/^\B../ 는 "noonday"이라는 문자열에서 "oo"을 결과로 나타낸다.
/y\B./ 는 "possibly yesterday"이라는 문자열에서 "ye"를 결과로 나타낸다.
[\b] 백스페이스(back-space) 백스페이스를 나타내는 문자이다.
\b와 [\b] 다른 문자이다. 혼동하지 않도록 주의해야한다.
* 0회 이상 반복 "*"문자 앞에 나오는 문자 또는 식이 0개 이상 나타남을
의미한다.

예) /^a*bc$/ : "bc", "abc", "aabc", "aaabc" 모두 이 패턴에 일치한다.
+ 1회 이상 반복 "+"문자 앞에 나오는 문자 또는 식이 1개 이상 나타남을
의미한다.

예) /^a+b$/ : "ab", "aab", "aaab" 모두 이 패턴에 일치하지만, "b"는 이 패턴에 일치하지 않는다.
? 0회 또는 1회 "?"문자 앞에 나오는 문자 또는 식이 0개 또는 1개가 나타남을 의미한다.

예) /^a?b$/ : "b", "ab" 모두 이 패턴에 일치한다.
{m, n} m회 이상 n회 이하 "{m, n}" 앞에 나오는 문자 또는 식이 m개 이상, n개 이하로 나타남을 의미한다.

예) /^a{1, 2}b$/ : "ab", "aab" 모두 이 패턴에 일치하지만, "b", "aaab"는 이 패턴에 일치하지 않는다.

"{m}" 과 같이 콤마와 n을 생략할 경우 앞에 나오는 문자 또는 식이 m개 나타남을 의미한다.

예) /^a{2}b$/ : "aab"는 이 패턴에 일치하지만, "b", "ab", "aaab"는 이 패턴에 일치하지 않는다.

"{m,}" 과 같이 n만 생략할 경우 앞에 나오는 문자 또는 식이 m개 이상 나타남을 의미한다.

예) /^a{1,}b$/ : "ab", "aab", "aaab" 모두 이 패턴에 일치하지만, "b"는 이 패턴에 일치하지 않는다.

이 밖에도 만약 ^, $, ?, . 등의 메타문자를 메타문자가 아닌 원래 문자로 이용하고 싶다면 문자 앞쪽에 \(역슬레쉬)를 붙여 사용하면 된다. 

예) \^, \$, \\, \?, \.
     - /^\$10$/ : "$10"가 이 패턴에 일치합니다.
     - /^1\.0$/ : "1.0"가 이 패턴에 일치합니다.

4. 플래그란?

플래그란, 정규표현식 끝에 붙여 검색에 영향을 줄 수 있는 옵션이다.
(Javascript 문법 기준의 설명이다. 사용 언어에 따라 달라질 수 있으니 참고바란다.)

5. 플래그의 종류와 용법

플래그 설명
i 대소문자 구분 없이 검색한다.
g 패턴과 일치하는 모든 것을 찾는다. 이 플래그가 없으면 패턴에 일치하는 첫 번째 결과만 반환된다.
m 다중 행 모드를 활성화 한다.
s "." 메타문자가 "\n"도 포함하도록 "dotall" 모드를 활성화 한다.
u 유니코드 전체를 지원하도록 한다. 이 플래그를 사용하면 서로게이트 쌍(surrogate pair)을 올바르게 처리할 수 있다.
y 문자 내 특정 위치에서 검색을 진행하는 "sticky" 모드를 활성화 한다.

다음 포스팅에선 전후방탐색에 대해 설명하도록 하겠다.


다음글:

2021.12.03 - [SW/Reference] - [정규표현식(Regular Expression) 정리] - 3. 전후방탐색(look-around)과 전방탐색(look-ahead)과 후방탐색(look-behind)

 

[정규표현식(Regular Expression) 정리] - 3. 전후방탐색(look-around)과 전방탐색(look-ahead)과 후방탐색(look-

2021.12.02 - [SW/Reference] - [정규표현식(Regular Expression) 정리] - 2. 메타 문자와 플래그 [정규표현식(Regular Expression) 정리] - 2. 메타 문자와 플래그 2021.12.02 - [SW/Reference] - [정규표현식(Re..

betaman-workshop.tistory.com

728x90
반응형