[Javascript 알짜개념] 정규표현식 기본 문법과 패턴 연습
정규표현식을 쓰는 이유?
- 문자 검색(Search)
- 문자 대체(Replace)
- 문자 추출(Extract)
정규표현식 기본 방식
// 생성자 방식
new RegExp('표현', '옵션')
new RegExp('[a-z]', 'gi')
// 리터럴 방식
/표현/옵션
/[a-z]/gi
정규표현식 메소드
정규식.test(문자열) - 일치 여부 반환
문자열.match(정규식) - 일치하는 문자의 배열 반환
문자열.replace(정규식, 대체문자) - 일치하는 문자를 대체
정규표현식 플래그
g : 모든 문자와 일치 (Global)
i : 영어 대소문자를 구분하지 않고 일치 (Ignore case)
m : 여러 줄 일치 (Multi line), 각각의 줄을 시작과 끝으로 인식
정규표현식 패턴
// 정규표현식(RegExp, Regular Expression)
^ab | 1줄(Line) 시작에 있는 ab와 일치
ab$ | 1줄(Line) 끝에 있는 ab와 일치
. | 임의의 한 문자와 일치
a|b | a 또는 b와 일치
ab? | b가 없거나 b와 일치
{3} | 3개 연속 일치
{3,} | 3개 이상 연속 일치
{3,5} | 3개 이상 5개 이하(3~5개) 연속 일치
+ | 1회 이상 연속 일치, {1,} 과 동일
[ab] | a 또는 b
[a_z] | a부터 z 사이의 문자 구간에 일치(영어 소문자)
[A-Z] | A부터 Z 사이의 문자 구간에 일치(영어 대문자)
[0-9] | 0부터 9 사이의 문자 구간에 일치(숫자)
[가-힣] | 가부터 힐 사이의 문자 구간에 일치(한글)
\w | 63개 문자(Word, 대소영문52개+숫자10개+ _)에 일치
\b | 63개 문자에 일치하지 않는 문자 경계(Boundary)
\d | 숫자(Digit)에 일치
\s | 공백(Space, Tab 등)에 일치
(?:) | 그룹 지정
(?=) | 앞쪽 일치(Lookahead)
(?<=) | 뒤쪽 일치(Lookbehind)
어떠한 비밀 암호를 배운 느낌이다.
보편적으로 많이 쓰는 정규표현식 예제를 풀어봐도 좋을 것 같다.
전화번호 XXX-XXXX-XXXX 하이픈으로 구분하기 혹은 주민번호 잘 입력되었는지 등등!!
그리고 정규표현식이 js 언어가 아니라! 모든 언어에 기본적으로 사용되어지는 표현식이라는 것을 처음 알게 되었다.
그렇다면 앞으로 사용자로부터 입력을 받을 때, 정규표현식이 많이 사용될 것 같다고 생각했다.
연습예제
const str = `
010-1234-5678
thesecon@gmail.com
Hello world!
https://www.omdbapi.com/?apikey=7035c60c&s=frozen
The quick brown fox jumps over the lazy dog.
hello@naver.com
http://localhost:1234
동해물과 백두산이 마르고 닳도록
abbcccddddeeeee
`
1. .com으로 끝나는 문자열을 찾아내라!
console.log(str.match(/\.com$/gm))
[풀이]
str.match(문자열) : 일치하는 문자를 배열로 반환
\. : .은 임의의 한 문자와 일치한다는 기능을 가지고 있는데 그것을 무시하고 문자로 인식하게 함
com$ : com으로 끝나는 문자를 반환
g : 모든 문자에서 찾도록 함
m : 줄바꿈을 기준으로 줄을 기준으로 시작과 끝을 지정함 (m 을 붙여주지 않으면 com$ 이것을 찾을 수 없음!!)
2. 숫자 중 3번 이상 ~ 9번 이하 반복하는 숫자를 찾아라
console.log(str.match(/\d{3,9}/g))
[풀이]
\d : 디지털 숫자에 일치하는지 찾음
{3,9} : 3개 이상 9개 이하 연속으로 일치하는지 찾음
3. 모든 소문자에서 연속하는 단어를 찾아라
console.log(str.match(/[a-z]+/g))
[풀이]
[a-z] : a에서 z사이의 문자 구간에 일치
+ : {1,} 과 같은 역할. 1개 이상 연속 일치