Programming > JavaScript

정규표현식

JavaScript 의 정규표현식

기본적인 구문

[ / ]는 정규표현패턴의 시작과 종료를 나타내는 예약어이다.
패턴내 /를 사용할려면 escape을 사용 [ \/ ]와 같이 사용해야 된다.
또한 \ 또한 예약어이므로 javascript 소스의 정규표현내 \d 등과 같은 정규식을 사용할 경우, \\d 와 같이 사용할 필요가 있다.

var regex = /정규표현/옵션;
var regex = new RegExp('정규표현', '옵션');

주요한 옵션
옵션 설명
g global search, 문자열전체를 대상으로 매칭되는가를 검색
지정 안할경우 1번 매칭된 시점에서 종료한다.
i 대소문자를 구별하지 않는다. (지정 안하면 구별한다)
m 여러행의 입력문자열을 여러행으로 취급
^ 또는 $ 가 각각의 행의 앞뒤에 매칭한다.
u Unicode대응
s . 을 개행문자와 일치하게 한다.
y 문자열의 맨 마지막부터 검색한다.
사용에 따른 의미가 다른 경우
       
\b \b vs [\b] 단어의 경계(단어취득) backspace를 의미 [\b]
^ ^a vs [^abc] 시작 (a로 시작하는 것) 부정 (a나 b나 c와 일치하지 않는것)
- [a-c] vs [abc-] a~c 까지중 1개 문자 a~c 나 하이픈(-) 4개 문자중 하나

 

정규표현 사용방법

정규표현식의 특수문자들
범주 문자조합
Character classes \.\cX\d\D\f\n\r\s\S\t\v\w\W\0\xhh\uhhhh\uhhhhh[\b]
Assertions ^$x(?=y)x(?!y)(?<=y)x(?<!y)x\b\B
Groups, backreferences (x)(?:x)(?<Name>x)x|y[xyz][^xyz]\Number
Quantifiers *+?x{n}x{n,}x{n,m}
Unicode property escapes \p{UnicodeProperty}\P{UnicodeProperty}

※ 참조 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

(1) 수량을 나타내는 형식 (Quantifiers
표현 의미 설명
x* 0회 이상 반복 /ab*/ = a뒤에 b가 없거나 여러개
x+ 1회 이상 반복 /ab+/ = a뒤에 b가 1개 이상 나올 것
/ab{1,}/ 과 동일하다
x? 0 또는 1회 /a?bc?/ = b앞에 a가 없거나 하나, 뒤에 c가 없거나 하나
x{n} n회 반복 /a{2}/ = a가 2회반복 "aa" 가 포함된거 ( aa취득)
x{n, } n회 이상 반복 /a{2,}/ = a가 2회이상 반복 (연속된 a 갯수만큼 취득)
x{n,m} n이상 m미만 /a{2,5}/ = a가 2~5사이 반복 
x*? 반복한정 (?) /<.*>/ 는 "<aa><bb>cc</bb></aa>" 에 일치시
/<.*?>/ 는 "<aa>" 에 일치


※ '<a><b></b></a>'.match(/<(.*?)>/);  => ?가 없으면 각각 태그가 아니고 전체일치 의미

(2) 그룹 범위를 나타내는 형식 (Groups, backreferences)
표현 의미 설명
(x) 캡쳐그룹 일치한 내용 보존
(?:x) 비캡쳐 그룹 일치하지만 내용은 보존안함
\Number    
(?<Name>x) 캡쳐이름 x를 찾아 groups명 Name에 저장
(3) 경계(선언) 를 나타내는 형식 (Assertions)
표현 의미 설명
^ 처음 시작 첫문자 일치여부, /^A/는 첫글자가 A로 시작이면 A
$ 마지막 끝남 마지막 일치여부, /Z$/는 Z로 끝날 경우 Z
\b 단어를 검색 /\ba/=a로 시작하는 단어일 경우 a를 취득
/zz\b/=zz로 끝나는 단어일 경우 zz를 취득
\B 단어구분 외 /\B../ = "noonday" 에서 "oo"  단어구분아닌 연속 2문자
/ye\B/ = "possibly yesterday" 에서 "ye" : ye로 끝나는 단어가 아닌 "ye" 취득
x(?=y) x 뒤 y 일때 x /ab(?=cd|ef)/ = "abcd" or "abef" 일 경우 둘다 "ab"를 취득
x(?!y) x 뒤 y가 아닐때 x /\d+(?!\.)/ = 숫자되에 . 이 없는 숫자를 취득
(?<=y)x y 뒤 x 일때 x /(?<=ab|cd)ef/ = "abef", "cdef" 인 경우 "ef" 취득
(?<!y)x y 뒤 x가 아닐때 x /(?<!-)\d+/ = 음수(-)가 안붙는 숫자와 일치
(4) 특수문자등 문자로 표현하는 형식 (Character class)
표현 의미 설명
[abc], [a-c] OR 일치 a,b,c 중 하나와 일치하면 취득
※ [abc-][-abc] 의 경우 하이픈이 범위가 아니고 a,b,c,- 4개중 하나 일치를 나타냄
\n 개행문자 개행문자와 일치
\s 공백 white space (스페이스, 탭, 개행문자코드 등)
\S 공백 이외 white space를 제외한 모든것 ex) /\Sw*/ "abc" in "abc def"
. (점) 어떤 1문자 1) 개행문자(\n,\r,\u2028,\u2029)를 제외한 1개문자를 의미
2) /./ and "\." 는 1개문자 but  /\./ and "\\."은 점(.)을 찾는다.
3) [.] 대괄호 안에서는 점을 의미 = [\.] 또는 \. 으로 해석된다.
\d 숫자 [0-9]와 동일하다 (/\d/ or /[0-9]/ 는 숫자를 검색
\D 숫자 이외 [^0-9]와 동일,  숫자이외 문자를 검색
\w 영수_문자 [A-Za-z0-9_] 언더라인 포함한 영수문자를 검색
\W 영수_이외 [^A-Za-z0-9_] 언더라인 포함한 영수문자를 제외하고 검색
x|y or x or y
\ escape escape 하는 것을 의미
[\b] backspace backspace 문자를 의미
\0 NULL NULL문자일치, 바로 뒤 숫자금지 (0~7)이오면 8진수 escape가 됨
\f 페이지 넘김 페이지 넘김과 일치
\v 탭(수직) 수직 tab과 일치
\t 탭(수평) 수평 tab과 일치 
\r 캐리지 리턴 carriage return 과 일치
\hhhh UTF-8 코드 hhhh(4자리16진수) UTF-16코드와 일치
\xhh 16진 코드 hh(2자리 16진수) 문자코드에 일치하는 문자
ex) /\cM\cJ/ = "\r\n",  /\cM/ = control-M 과 동일
\cX 특수문자 Controller 문자 (X 는 A-Z를 의미)
\u{hhhh}, \u{hhhhh} Unicode 16진수 Unicode값에 일치

정규표현 메소드 종류 및 사용법

메소드 반환값   설명
test true/false exp.test(str) 문자열에 일치하는 부분이 있는지 확인한다.
exec 배열/null exp.exec(str) 문자열중 일치하는 것을 검색한다.
결과를 배열로 반환, 없으면 null
match 배열/null str.match(exp) 캡쳐그룹포함해 모든 일치를 담은 배열 반환
matchAll 모든일치반복기 str.matchAll(exp) Capture Group을 포함한 모든 매칭을 갖는 iterator을 반환
RegExp String Iterator (/exp/g)
search index/-1 str.search(exp) 문자열중 일치하는지 테스트
매칭하면 index를 반환한다. 검색실패의 경우 -1을 반환한다.
replace 첫일치 변경 str.replace(exp,'$2..$1') 검색해 문자열을 치환
replaceAll 모두 변경 str.replaceAll(exp,replaceStr)  regex = ( /exp/g)
split 배열 str.split(exp) 정규표현이나 지정문자열로 문자열을 분할해 배열로 반환

 

1) match
찾으면 배열로 반환, 없으면 null을 반환
gi 옵션은 global(전체)를 검색하는데 대소구별안한다.
 

var str = "ABCDEAXY";
var result = str.match(/[a-c]/gi);
console.log(result);

▶ (4) ["A", "B", "C", "A"]

2) exec
없을 경우 null을 반환한다.
배열 [0]에는 마지막 매칭 문자, [1] 이후에는 ( )안 그룹 문자열에 매칭이 셋팅된다.
 

var str = "ABCDEAXY";
var result = /[a-c]/gi.exec(str);
console.log(result);

▶ ["A", index: 0, input: "ABCDEAXY", groups: undefined]

3) test

검색문자열을 검색해 true/false로 반환한다.

var str = "ABCDEAXY";
var result = /[a-c]/gi.test(str);
console.log(result);

▶ true

4) search

지정 정규표현으로 검색된 맨처음 문자의 위치를 반환한다.
맨앞일경우 0, 존재하지 않을 경우에는 -1을 반환한다.

var str = "xxABCDEAXY";
var result = str.search(/[a-c]/i);
console.log(result);

▶ 2

5) replace

매칭문자열을 치환하거나, 매칭변수에 저장해 치환할 수 있다.
인수로 $1 ~ $9 까지 특수변수를 사용할 수 있다. 그룹화 ( )괄호로 사용가능

var str = "010-1234-5678";
var result = str.replace(/^(\d{3})-\d{4}-(\d{4})$/, '$1-****-$2');
console.log(result);

▶ 010-****-5678

6) split

var str = "2020/01/10 23:20:40.1234";
var result = str.split(/[\/\.:\s]/);
console.log(result);

▶ (7) ["2020", "01", "10", "23", "20", "40", "1234"]