정규표현이란
문자열 내에 문자의 구성을 조합하기 위해 이용하는 패턴이다.
우편 번호를 이용한 간단한 예를 보자면 다음과 같다.
> 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메소드는 정규표현식으로 문자열을 분할하기 위해 사용한다.
참고자료
'IT > 언어' 카테고리의 다른 글
[JavaScript] Object.assign에 대한 이해 (0) | 2020.11.27 |
---|---|
[JavaScript] JavaScript 쇼트 코딩 테크닉(1) (0) | 2020.11.19 |
[python] python 코딩 스타일 가이드 (0) | 2020.11.12 |
[python] Google 스타일의 Python Docstring 입문 (0) | 2020.10.21 |
[JavaScript] JavaScript의 작성법 (0) | 2020.10.06 |