티스토리 뷰

Js

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

hi_hannah 2021. 5. 16. 22:14

정규표현식?

문자열에서 특정한 문자를 찾아내는 작업을 해야 한다고 하자. 작업의 대상(특정한 문자)을 찾은 다음, 작업을 해야 한다.

 

  1. 특정한 문자가 어떤 패턴을 가지고 있는지 찾는다.
  2. 문자열에서 패턴에 일치하는 문자를 찾는다.

정규표현식에서는 1번을 컴파일, 2번을 실행이라고 한다. 더 구체적으로 말하면 패턴을 정규표현식 객체로 만드는 과정을 컴파일이라고 한다. 그리고 패턴에 일치하는 문자를 찾는 과정을 실행이라고 한다.

정리하면 정규표현식은 문자열에서 특정한 문자를 찾아내는 도구 역할을 한다. 정규표현식은 컴파일, 실행 두 가지 단계로 이루어진다.

컴파일

컴파일은 검출하고자 하는 패턴을 만드는 일이다. 패턴은 정규표현식 객체로 만들어지며 정규표현식 리터럴, 정규표현식 객체 생성자 두 가지가 있다.

1. 정규표현식 리터럴

var pattern = /a/; 

리터럴은 /(슬래시)/(슬래시)로 감싸야 하며 '(따옴표)를 사용하지 않아야 한다.

  • 리터럴은 스크립트가 불러올 때 컴파일된다.
  • 정규표현식이 변하지 않을 경우 상수로 사용해서 성능을 향상시킬 수 있다.

2. 정규표현식 객체 생성자

var pattern = new RegExp('a');

인자는 /로 감싸지 않으나 ' or " 따옴표를 사용한다.

  • 생성자 함수를 사용하면 정규표현식이 실행 시점에 컴파일된다.
  • 정규표현식의 패턴이 변경될 수 있는 경우 사용한다.

실행

실행은 대상에 대한 구체적인 작업을 수행한다. 작업에는 검색, 판별, 치환이 있다.

  • 검색 : 패턴에 해당되는 문자열을 찾는다.
  • 판별 : 패턴에 해당되는 문자열이 있는지 검사한다.
  • 치환 : 패턴에 해당되는 문자열을 다른 문자열로 치환한다.

1. RegExp에서 실행

RegExp.exec()

exec()는 인자 안에 패턴에 해당되는 문자열을 찾아서 배열로 리턴한다. 패턴에 해당되는 문자열이 없을 경우 null을 리턴한다.

var pattern = /a/; 
pattern.exec('abcde'); // ["a"]
var pattern = /a./; // a 다음에 1개의 문자가 와야 한다.
patten.exec('abcde'); // ["ab"]
pattern.exec('bcdef') // null, 패턴에 일치하는게 없기 때문에

RegExp.test()

test()는 인자 안에 패턴에 해당되는 문자열이 있으면 true, 없으면 false를 리턴한다.

var pattern = /a./; 
patten.test('abcde'); // true
patten.test('bcdef'); // false

2. String에서 실행

String.match()

match()는 패턴에 해당되는 문자열을 찾아서 배열로 리턴한다. 패턴에 해당되는 문자열이 없을 경우 null을 리턴한다.

var pattern = /a/; 
'abcdef'.match(pattern); // ["a"];
'bcdefg'.match(pattern); // null

String.search()

search()는 패턴에 해당되는 문자열이 있는지 검사하는 메서드다. 해당하는 부분의 인덱스를 리턴한다. 패턴에 해당하는 문자열이 없으면 -1을 리턴한다.

String.replace()

문자열에서 패턴에 해당되는 문자열을 찾아서 다른 문자열로 치환하는 메서드다.

var pattern = /a/; 
'abcdef'.replace(pattern, 'A'); // "Abcdef"

패턴

문장의 시작과 끝

문자 의미
^ 문장의 시작
$ 문장의 끝

수량자

문자 의미
? 앞의 표현식이 0 또는 1회 => {0,1}
* 앞의 표현식이 0회 이상 연속으로 반복 => {0,}
+ 앞의 표현식이 1회 이상 연속으로 반복 => {1,}
{n} n번 반복, n은 양의 정수여야 한다
{min,} 최소
{min, max} 최대. min <= max를 만족해야 한다.

그룹과 범위

문자 의미
| 또는
( ) 그룹
[^] 부정 문자셋
(?:) 찾지만 기억하지는 않음

문자

문자 의미
\ 특수 문자가 아닌 문자
. 어떤 글자(줄바꿈 문자 제외)
\d digit 숫자 => [0-9]
\D digit 숫자 아님 => [^0-9]
\w word 문자 => [A-Za-z0-9_]
\W word 문자 아님 => [^A-Za-z0-9_]
\s 페이스, 탭, 폼피드, 줄 바꿈 문자등을 포함한 하나의 공백 문자
\S 공백 문자가 아닌 하나의 문자
\t 탭문자
\f 폼피드 문자
\n 줄 바꿈 문자

 

패턴 활용

var pattern = /\$/; // 문자 '$'가 있는 패턴
pattern.exec('$12$ \-\ $25$'); // ["$"], index : 0
var pattern = /^\$/;  // 문장의 시작에 문자 '$'가 있는 패턴
pattern.exec('$12$ \-\ $25$'); // ["$"] , index : 0
var pattern = /\$$/;  // 문장의 끝에 문자 '$'가 있는 패턴
pattern.exec('$12$ \-\ $25$'); // ["$"], index : 10

※ escape?
정규표현식에서 원래 는 문장의 끝이라는 역할을 가지고 있다. 하지만 앞에 \가 오면 기존 역할에서 탈출(escape)한 단순한 문자 $를 의미하는 것으로 \$를 escape 문자라고 한다.

플래그

정규표현식 패턴을 만들 때 옵션을 설정할 수 있다.

플래그 설명
g 전역 검색
i 대소문자 구분 없는 검색
m 다중행(multi-line) 검색
s .에 개행 문자도 매칭(ES2018)
u 유니코드; 패턴을 유니코드 코드 포인트의 나열로 취급한다.
y "sticky" 검색을 수행. 문자열의 현재 위치부터 검색을 수행한다

참고자료

 

댓글