IT/언어

[JavaScript] JavaScript 정규표현식

개발자 두더지 2020. 11. 19. 00:05
728x90

정규표현이란


문자열 내에 문자의 구성을 조합하기 위해 이용하는 패턴이다.

우편 번호를 이용한 간단한 예를 보자면 다음과 같다.

> var pattern = /^\d{3}-?\d{4}$/g;
> var postcode = '121-4440'; //올바른 우편번호	
> var result = postcode.match(pattern);
undefined
> result
["121-4440"]

> var pattern = /^\d{3}-?\d{4}$/g;
> var postcode = '121-444'; //올바르지 않는 우편번호
> var result = postcode.match(pattern);
undefined
> result
null

postcode가 올바른 우편번호인 경우에 result에 대입되고, 그렇지 않다면 null이 대입되도록 하는 코드이다.

 

 

정규표현식에 사용하는 주요 정규표현 패턴


 

문자 설명 예시
ABC 「ABC」라는 문자열에 매칭 -
[ABC] A,B,C의 중 어느 한 문자와 매칭 -
[^ABC] A,B,C 이외의 어느 한 문자와 매칭 -
[A-Z] A에서Z사이의 한 문자와 매칭 -
\ 다음 문자를 이스케이프(;특수문자를 단순문자로 해석) -
^ 행의 제일 앞의 글자와 매칭 /^A/ 라면, "BBA" 경우의 'A'는 매칭되지 않지만, "ABB" 의 'A' 에는 매칭된다.
$ 행의 제일 끝 글자와 매칭 /A$/ 라면, "ABB" 경우의 'A' 는 매칭되지 않지만, "BBA" 의 'A' 는 매칭된다.
* 이전의 문자를 0번 이상 반복해서 매칭 /fe* / 라면, "f" 혹은 "fee" 에 매칭된다. "eee" 는 매칭되지 않는다.
+ 이전의 문자의 1문자 이상을 반복해서 매칭 /fe+ / 라면, "fe","fee"과 매칭되지만, "eee"는 매칭되지 않는다.
? 이전의 문자 0혹은 1회 출현시 매칭 /fe? / 라면, "f","fe"과 매칭되지만。"fee" 는 매칭되지 않는다.
{n} 이전의 문자를 n번 매칭 "[0-9]{3}"는 3개의 숫자
{n,} 이전의 문자를 n번 이상 매칭 "[0-9]{3,}"는3개 이상의 숫자
{m,n} 이전의 문자를 m~n번 매칭 "[0-9]{3~5}"는 3부터5개의 숫자
. 개행문장 이외 어떠한 한 문자도 매칭 /.n/ 라면"nay an apple is on the tree"의 "an","on"와는 매칭되지만,"nay"는 매칭되지 않는다.
\w 대문자/소문자의 영어, 숫자, 언더스코어 매칭 ("[A-Za-z0-9]"과 동일한 의미) -
\W 문자 이외의 것에 매칭 ("[^\w]"과 동일한 의미) -
\d 숫자에 대해 매칭 ("[0-9]"과 동일한 의미) -
\D 숫자 이외 것에 대해 매칭 ("[^0-9]"과 동일한 의미) -
\n 개행에 대해 매칭 -
\r 復帰に一致 -  
\t 탭(Tab)문자에 대해 매칭 -
\s 공백 문자에 대해 매칭 -
\S 공백 문자 이외의 문자에 대해 매칭 ("[^\s]"과 동일한 의미) -
~ 「~」로 표시되는 문자 -

 

 

정규표현식을 작성하는 두 가지 방법


리터럴를 이용하는 방법

 var str = /정규표현식/객체;

※ 주의 :정규표현 리터럴에서의 /는 정규표현식 패턴의 시작과 종료를 나타내는 예약문자이다. 따라서 정규표현식 패턴에 /가 포함되는 경우에는 /만 사용하는 것이 아닌 \ /를 사용해서 이스케이프해야한다.

RegExp 객체 생성자를 경우하는 방법

var str = new RegExp('정규표현식','객체');

※ 주의 : 생성자 구문에서는 정규표현식과 문자열을 지정한다. JavaScript에서는 \는 예약문자이다. 따라서 \d를 인식시키기 위해서는 \\\로 작성하여 이스케이프해 한다.

주요 옵션

옵션 설명
g 글로벌 서치. 문자열 전체에 대해 매칭할 것인가를 결정하는 옵션. (지정하지 않는 경우는 1번 매칭된 시점에서 처리 종료)
i 대문자/소문자를 구별하지 않는 옵션 (지정하지 않는 경우 구별 )
m 복수 행의 입력 문자열을 복수행으로써 다루기 위한 옵션 (^혹은$가 각행의 맨 앞과 끝에 매칭)
u Unicode 대상(한자등이 인식되도록 하기 위해)

 

 

정규표현식을 사용하는 메소드


match 메소드

str.match(pattern) //str:검색 대상 문자열  pattern:정규표현식

//예시
> var str = "ABCDEFG"
> var result = str.match(/[a-c]/gi);
undefined
> console.log(result);
 (3) ["A", "B", "C"]

match 메소드는 정규 패턴에 매칭되는 문자열을 배열로 돌려준다. 매칭되지 않은 경우 null이 리턴된다.
g옵션이 포함되는 경우만, 매칭되는 모든 것을 포함한 배열을 리턴한다.

exec 메소드

regexp.exec(str) //regexp:정규표현식 //str: 검색 대상 문자열

//예시
> var result = /(.+)cde(f)/.exec("abcdefg");
undefined
> console.log(result);
(3) ["abcdef", "ab", "f", index: 0, input: "abcdefg", groups: undefined]

match메소드와 기본적으로 동일하다. 리턴된 배열의 0번 인덱스 ([0]) 에는 마지막으로 매칭된 문자가 들어가 있다.
1번 이후의 인덱스는 ( )로 둘러싸인 부분의 문자열의 매칭 세트로 묶여진다. 일치되는 문자가 없는 경우 마찬가지로 null이 리턴된다.

test 메소드

regexp.test(str) //regexp:정규 표현식 str: 검색 대상 문자열 

//예시
> var result = /[0-9]{3}/.test(999);
undefined
> console.log(result);
true

전달된 문자열을 검색하고, true/false를 리턴한다.
정규표현식으로 매칭된 문자열을 추출하기 위해서는 String.match/RegExp.exec메소드를 사용하지만, 일치여부만을 확인하고 싶다면 RegExp.test메소드를 사용하는 것이 가장 간단하다.

search 메소드

str.search(pattern) //str: 검색 대상 문자열 pattern: 정규 표현식

//예시
> var str = "ABCDEFG";
> var result = str.search(/DEF/);
undefined
> console.log(result);

String.search메소드는 지정된 정규표현식에 제일 처음 매칭된 문자 위치를 리턴한다.
매칭된 문자열이 존재하지 않는 경우 -1이 리턴된다.

replace 메소드

str.replace(pattern,rep) //str:변환 대상 문자열 pattern:정규 표현식 rep:변환 후 문자열

//예시(1)
var data = "090-1234-5678";
var secret_data = data.replace(/^\d{3}-\d{4}-\d{4}$/, '***-****-****');

console.log(secret_data);

****-****-****
//예시(2)
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1"); //$1にはJohn $2にはSmith

console.log(newstr);
Smith, John

String.replace 메소드는 정규표현식으로 매칭된 문자열의 대체하는 메소드이다.
인수 rep에는 「$1 ~ $9」와 같은 특수 변수를 사용하는 것이 가능하다.
이것들은 서브 매치 문자열을 저장하기 위핸 변수로, 정규표현에서 ()로 감싸진 문자열이 순서대로 세트로 묶인다.

split 메소드

str.split(sep [,limit]) //str:분할 대상의 문자열 sep:구분 문자(정규표현식) limit: 최대 분할 횟수

//예시
var pattern = /[\/\.\-]/; // 「/」,「-」,「.」를 구별해 년/월/일을 분할하는 코드

console.log('2016/12/04'.split(pattern));
["2016", "12", "04"]
console.log('2016-12-04'.split(pattern));
["2016", "12", "04"]
console.log('2016.12.04'.split(pattern));
["2016", "12", "04"]

String.split메소드는 정규표현식으로 문자열을 분할하기 위해 사용한다.


참고자료

qiita.com/iLLviA/items/b6bf680cd2408edd050f

728x90