suyeonme

[Regex] 정규 표현식(Regular Expression) 본문

프로그래밍👩🏻‍💻/정규표현식

[Regex] 정규 표현식(Regular Expression)

suyeonme 2022. 5. 29. 22:26

정규 표현식을 자주 사용을 안 하다보니, 사용할 때마다 디테일한 문법들이 기억이 잘 나지 않아서 그 때 그 때 필요한 부분을 찾아서 사용을 하곤한다.

 

오늘은 복습 차원에서 정규 표현식을 다시 정리해보았다.

 

1. 정규 표현식(Regular Expression)이란?

정규 표현식은 문자열에서 특정 문자 조합을 찾기 위한 패턴이다. 정규 표현식은 아래의 두 가지 방법으로 만들 수 있다.

1.1. Literal

  • 스크립트를 불러올 때 컴파일
  • 바뀌지 않는 정적인 패턴의 경우 사용
const regex = /ab+c/

1.2. Regex Constructor 

  • 런타임에 컴파일
  • 동적으로 바뀌는 패턴의 경우 사용
const regex = new RegExp('ab+c');

// 동적으로 값을 할당하는 경우
const regex = new RegExp(`${pattern1}|${pattern2}`, 'gi');
str.match(regex);

2. 문법 (Pattern + Flag)

  • 정규 표현식은 /로 시작하여 /로 끝난다.
  • 문자열의 따옴표("")는 생략한다.
  • pattern과 flag로 구성된다.
  • 메타 문자를 텍스트 자체로 표현하려면, 해당 메타 문자 앞에 escape 문자(\, backslash)를 사용한다.

2.1. Pattern, Meta 문자 

  • escape 문자 + 대문자는 부정(NOT) 케이스이다. 
Pattern Description 예시
^ 줄의 시작에서 일치 ^a (a로 시작하는 문자열) 
$ 줄의 에서 일치 a$ (a로 끝나는 문자열)
a|b a 또는 b와 일치 (index가 작은 것을 먼저 반환)  
* 0회 이상 연속으로 반복되는 문자와 가능한 많이 일치 a* (a가 0번 이상 반복)
*? 0회 이상 연속으로 반복되는 문자와 가능한 적게 일치 a? (a가 존재하거나 존재하지 않음)
+ 1회 이상 연속으로 반복되는 문자에 가능한 많이 일치 a+ (a가 1번 이상 반복)
+? 1회 이상 연속으로 반복되는 문자에 가능한 적게 일치  
? 없거나 1회 가능한 많이 일치  
?? 없거나 1회 가능한 적게 일치  
() capture할 그룹 (\w+) 하나 이상의 단어 문자를 탐색
(?:) capture하지 않는 그룹  
(?=) 앞쪽 일치, lookahead  
(?!) 부정 앞쪽 일치, negative lookahead  
(?<=) 뒤쪽 일치, lookbehind  
     
[ab] a 또는 b와 일치 (메타 문자는 []안에서 특수 문자로 취급되지 않음)  
[a-z] a부터 z사이의 문자 구간에 일치   
[A-Z] A부터 Z사이의 문자 구간에 일치  
[0-9] 0부터 9사이의 숫자 구간에 일치  
[^ab] a 또는 b가 아닌 문자에 일치, NOT  
     
a{n} a를 n번 반복한 문자에 일치 a{3}
a{n,} a를 n번 이상 반복한 문자에 일치 a{3,}
a{n,m} a를 n번 이상 m번 이하 반복한 문자에 일치 a{3,5}
     
\ escape 문자  
\b (boundary) 63개 문자에 일치하는 경계  
\B  63개 문자가 아닌 나머지 문자에 일치하는 경계 (영문 대소문자 52개 + 숫자 10개 + _(underscore))  
\d (digit) 숫자에 일치  
\D  숫자가 아닌 문자에 일치  
\s (space) 공백에 일치 (space, tab등)  
\S 공백이 아닌 문자에 일치  
\w (word) 63개 문자에 일치  
\W 63개 문자가 아닌 나머지 문자에 일치  
\u (unicode) 유니 코드 문자에 일치  
\n  줄바꿈 문자에 일치  

 

2.1.1 Escape 문자

escape가 필요한 메타 문자는 아래와 같다.

  • [], brackets
  • (), parentheses
  • {}, curly braces
  • *, +, ?, |, operators
  • ^, $, anchors
  • ., \ 

예를 들어, \(slash)를 텍스트 그대로 표현하기 위해서는 \/와 같이 앞에 escape 문자를 작성한다.

 

2.1.2 Capturing Group

Capturing Group을 사용하면, 일치(match)된 문자열에서 일부를 추출할 수 있다. 예를 들면, suyeon@gmail.com에서 @앞 이메일 ID를 추출하거나, 도메인의 서브 도메인을 추출하는등의 행위가 가능하다. 

 

  • 하나의 캡쳐링 그룹 뒤에 quantifier를 넣으면, 캡쳐링 그룹 전체의 반복을 나타낸다. (하나의 문자 뒤에 quantifier를 넣으면, 해당 문자의 반복)
  • (?:)는 캡쳐링하지 않는 캡쳐링 그룹이다.
const str = 'Gogogo now!';

// capture group vs non-capture group
str.match(/(go)+/ig); // ['Gogogo']
str.match(/go+/ig) ); // ['Go', 'go', 'go']

2.2 Flag

  • 정규 표현식의 옵션으로 검색 방식을 설정한다.
  • 순서와 상관없이 여러개의 플래그를 설정할 수 있다.
Flag Description
g (global) 패턴과 일치하는 모든 검색 결과를 배열로 반환
i (ignorecase) 대소문자를 구분하지 않음 
m (multi line) 문자열의 행이 바뀌어도 패턴을 검색
y (sticky) 문자 내 특정 위치에서 패턴을 검색

예를 들어,  ig와 같이 작성하면, 대소문자 구분없이 패턴과 일치하는 모든 문자를 배열로 반환한다.

 


3. RegExp의 메서드(method)

Javascript에서 정규 표현식 사용하기

  • match()사용시 g 플래그를 적용하면, match 결과 내에 포함된 캡처는 반환하지 않는다. 
Comments