정규표현식을 사용하면 문자열에서 특정한 문자를 쉽게 찾아낼 수 있다.
원래대로였다면 수십 줄이 필요한 코딩 작업을 한두줄로 끝낼 수 있다!
정규표현식에서의 유효성 검사
휴대전화 번호 유효성 검사 let regExp = /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/;
이메일 유효성 검사 let regExp = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;
정규 표현식은 /리터럴 패턴/과 '생성자 함수 호출 패턴' 두가지 방법으로 사용할 수 있습니다.
리터럴 패턴
let pattern = /c/; // 'c 를 찾을 거야!' 라고 컴퓨터에게 명령을 내리는 것입니다. // 찾고 싶은 c를 pattern 이라는 변수에 담아놨기 때문에 이 변수를 이용하여 c를 찾을 수 있습니다.
생성자 함수 호출 패턴
let pattern = new RegExp('c'); // new 를 이용해서 정규 표현식 객체를 생성하고, // 리터럴 패턴과 동일하게 'c 를 찾을 거야!' 라는 명령입니다.
exec()
exec 는 execution 의 줄임말로, 원하는 정보를 뽑아내고자 할 때 사용합니다. 검색의 대상이 찾고자 하는 문자열에 대한 정보를 가지고 있다면 이를 배열로 반환하며, 찾는 문자열이 없다면 null을 반환합니다.
let pattern = /c/; // 찾고자 하는 문자열
pattern.exec('codestates') // 검색하려는 대상을 exec 메소드의 첫 번째 인자로 전달합니다.
// 즉, 'codestates' 가 'c' 를 포함하고 있는지를 확인합니다.
// 이 경우 'c' 가 포함되어 있으므로, ['c'] 를 반환합니다.
test()
찾고자 하는 문자열이 대상 안에 있는지의 여부를 boolean 으로 리턴합니다.
let pattern = /c/;
pattern.test('codestates');
// 이 경우는 'codestates'가 'c'를 포함하고 있으므로 true 를 리턴합니다.
match()
RegExp.exec() 와 비슷한 기능을 하며, 정규 표현식을 인자로 받아 주어진 문자열과 일치된 결과를 배열로 반환합니다. 일치되는 결과가 없으면 null 을 리턴합니다.
let pattern = /c/;
let str = 'codestates';
str.match(pattern);
// str 안에 pattern 이 포함되어 있으므로, ['c'] 를 반환합니다.
replace()
'검색 후 바꾸기'를 수행합니다. 첫 번째 인자로는 정규표현식을 받고, 두 번째 인자로는 치환하려는 문자열을 받습니다. 문자열에서 찾고자 하는 대상을 검색해서 이를 치환하려는 문자열로 변경 후 변경된 값을 리턴합니다.
let pattern = /c/;
let str = 'codestates';
str.replace(pattern, 'C');
// str 안에서 pattern 을 검색한 후 'C' 로 변경하여 그 결과를 리턴합니다.
// 여기서는 'Codestates'가 반환됩니다.
split()
주어진 인자를 구분자로 삼아, 문자열을 부분 문자열로 나누어 그 결과를 배열로 반환합니다.
"123,456,789".split(",") // ["123", "456", "789"]
"12304560789".split("0") // ["123", "456", "789"]
search()
정규표현식을 인자로 받아 가장 처음 매칭되는 부분 문자열의 위치를 반환합니다. 매칭되는 문자열이 없으면 -1을 반환합니다.
"JavaScript".search(/script/); // -1 대소문자를 구분합니다
"JavaScript".search(/Script/); // 4
"codestates".search(/ode/); // 1
정규표현식은 플래그를 설정해 줄 수 있으며, 플래그는 추가적인 검색 옵션의 역할을 해 줍니다. 이 플래그들은 각자 혹은 함께 사용하는 것이 모두 가능하며, 순서에 구분이 없습니다. 아래는 자주 사용되는 3가지 플래그입니다.
i
i를 붙이면 대소문자를 구분하지 않습니다.
let withi = /c/i;
let withouti = /c/;
"Codestates".match(withi); // ['C']
"Codestates".match(withouti); // null
g
global 의 약자로, g 를 붙이면 검색된 모든 결과를 리턴합니다.
let withg = /c/g;
let withoutg = /c/;
"coolcodestates".match(withg); // ['c', 'c']
"coolcodestates".match(withoutg); // ['c'] g 가 없으면 첫 번째 검색 결과만 반환합니다
m
m을 붙이면 다중행을 검색합니다.
let str = `1st : cool
2nd : code
3rd : states`;
str.match(/c/gm)
// 3개의 행을 검색하여 모든 c 를 반환합니다.
// ['c', 'c']
str.match(/c/m)
// m은 다중행을 검색하게 해 주지만, g 를 빼고 검색하면 검색 대상을 찾는 순간 검색을 멈추기 때문에
// 첫 행의 ['c'] 만 리턴합니다.
정규표현식에 다양한 특수기호를 함께 사용하면 문자열을 다룰 때에 더 많은 옵션을 설정할 수 있습니다.
정규식 패턴
- 설명
^
줄(Line)의 시작에서 일치 /^abc/
$
줄(Line)의 끝에서 일치 /xyz$/
.
(특수기호, 띄어쓰기를 포함한) 임의의 한 문자
a|b
a or b 와 일치, 인덱스가 작은 것을 우선 반환
*
0회 이상 연속으로 반복되는 문자와 가능한 많이 일치. {0,} 와 동일
*?
0회 이상 연속으로 반복되는 문자와 가능한 적게 일치. {0} 와 동일
+
1회 이상 연속으로 반복되는 문자와 가능한 많이 일치. {1,} 와 동일
+?
1회 이상 연속으로 반복되는 문자와 가능한 적게 일치. {1} 와 동일
{3}
숫자 3개 연속 일치
{3,}
3개 이상 연속 일치
{3, 5}
3개 이상 5개 이하 연속 일치
()
캡쳐(capture)할 그룹
[a-z]
a부터 z 사이의 문자 구간에 일치(영어 소문자)
[A-Z]
A부터 Z 사이의 문자 구간에 일치(영어 대문자)
[0-9]
0부터 9 사이의 문자 구간에 일치(숫자)
\(역슬래쉬)
escape 문자. 특수 기호 앞에 \를 붙이면 정규식 패턴이 아닌, 기호 자체로 인식
\d
숫자를 검색함. /[0-9]/와 동일
\D
숫자가 아닌 문자를 검색함. /[^0-9]/와 동일
\w
영어대소문자, 숫자, (underscore)를 검색함. /[A-Za-z0-9]/ 와 동일
\W
영어대소문자, 숫자, (underscore)가 아닌 문자를 검색함. /[^A-Za-z0-9]/ 와 동일
[^]
[]안의 문자열 앞에 ^이 쓰이면, []안에 없는 문자를 검색함