정규 표현식은 문자열에서 특정 내용을 찾거나 대체 또는 발췌하는데 사용된다.
// 예를 들어 010-1234-5678 이라는 전호번호는 "숫자3개", "-", "숫자4개", "-", "숫자4개" 로 이루어져 있다.
const regex = /\d{3}-\d{4}-\d{4}/;
// (\d는 숫자를 의미하고, {} 안의 숫자는 갯수를 의미한다.)
regex.test('010-1234-5678') // true;
regex.test('01-12-23') // false;
그러나 정규표현식은 주석이나 공백을 허용하지 않고, 여러가지 기호를 혼합하여 사용하기 때문에 가독성이 좋지 않다는 단점이 있다.
1) 정규식 리터럴
let regex = /ab+c/;
2) RegExp 객체의 생성자 함수 호출
let regex = new RegExp("ab+c");
단순 패턴
/sanghun/
위의 단순 패턴은 표현된 문자열을 그대로 대응시키고자 할 때 사용된다.
문자열에서 정확하게 'sanghun' 순서까지 모두 일치한다면 대응이 된다.
"sangabchun" = "sanghun" 사이에 abc가 들어가있지만 sanghun의 순서가 일치하므로 대응이 됨
"sangabchnu" = 똑같이 abc가 들어가있지만 "sanghun"에서 u와 n 순서의 불일치로 대응이 안됨
특수 문자 패턴
있는 그대로의 패턴 대응이 아닌 공백을 찾거나, 하나 이상의 'a'를 찾거나 등등 조금 더 복잡한 대응을 필요로 할 경우 특수 문자 패턴이 필요하다.
/sanghu*n/ -> * 별표 곱하기가 아니라 shift + 숫자8 특수문자에요ㅎㅎ
의 뜻은 바로 앞의 문자가 0개 이상이라는 것을 의미한다.
즉, 위의 패턴은 각각 s, a, n, g, h, u문자 + n문자 순으로 나오는 것과 대응한다.
여러가지 메소드가 있지만 대표적인 3가지는 test, match, replace가 있다.
let str = `
010-1234-5678
sanghun0404@naver.com
Hello world!
`
// 모두 리터럴 방식 사용
// regexp는 정규식, str은 문자열
//.test()
const regexp = /sanghun/gi
console.log(regexp.text(str)) // 결과 : true
// .replace()
const regexp = /sanghun/gi
console.log(str.replace(regexp, 'AAA')) // 결과 : "sanghun"이라는 단어가 "AAA"로 대체된다.
// .match()
const regexp = /sanghun/gi
console.log(str.match(regexp)) // 결과 : "sanghun"이라는 단어가 배열 데이터로 콘솔에 출력이 된다. [sanghun]
위의 메소드 예시 코드를 보면, 리터럴 방식으로 표현하고 그 뒤에 옵션으로 처음보는 영단어 표현이 있어서 해석하기 어려울 수 있다.
이를 해석하기 위해서는 플래그를 알고 있다면 쉽게 이해할 수 있으며, 대표적인 3가지로 g, i, m이 있다.
추가로, 문자열을 정의할때 `와 같은 백틱 기호를 사용하면 줄바꿈을 하더라도 한줄로 인식을 하게된다.
따라서 위의 예시 코드에서 백틱 기호로 문자열을 정의하고, m을 사용하게 된다면
010-1234-5678
sanghun0404@naver.com
Hello world!
각각 한 줄당 시작과 끝이 존재하도록 해준다.