자바스크립트에서 정규표현식을 처리하기 위해서는 RegExp를 사용한다. RegExp객체를 얻기 위해서는 생성자 함수를 이용해도 되지만 간단히 표현식 자체를 쓰기도 한다.
// 기본 문법
new RegExp(pattern[, flags])
/pattern/flags
// 사용 예
let regexp = new RegExp("/[a-z]{2}", "/g" );// 생성자 함수의 이용
let regexp = /[a-z]{2}/g;
test()
문자열에 정규표현식 내용이 포함되어있는지 확인하기 위해서는 test 함수를 사용한다. test 함수를 사용할 때는 RegExp의 lastIndex 속성에 대해 잘 알아야 하는데 이 값은 검색을 시작하는 위치이다. 주의할 점은 test()를 실행하면서 매칭이 발견되면 RegExp의 lastIndex가 업데이트 된다는 점이다.
let regexp = /[a-z]{2}/g; //알파벳 소문자 2~5개
let strs = ["henry", "Hel"]
console.log(regexp.test(strs[0]), regexp.lastIndex) // true, 2
console.log(regexp.test(strs[1]), regexp.lastIndex) // 부분 일치 포함 하지만 2부터 찾으므로 false
console.log(regexp.lastIndex) // 0
따라서 하나의 RegExp 객체를 이용해서 여러 문자열에 대해 test()를 실행할 경우는 0으로 reset 해줄 필요가 있다.
당연히 하나의 문자열에 대해서 몇 번이나 일치했는지 알고 싶으면 lastIndex 반드시 필요하다.(내부적으로)
let regexp2 = /\d{2,}/g
let str = "그는 10살이고 키는 180이다."
let cnt=0;
while(regexp2.test(str)){
cnt++;
}
console.log(`${str}에는 ${regexp2}가 ${cnt}번 나온다.`)
// 그는 10살이고 키는 180이다.에는 /\d{2,}/g가 2번 나온다.
exec()
exec()를 사용하면 좀 더 자세한 정보를 제공해준다. exec()는 match에 실패하면 null을 반환하고 RegExp의 lastIndex를 0으로 설정한다. 성공할 경우는 배열을 반환하며 lastIndex를 match된 다음 index로 설정한다.
exec()의 리턴으로는 일치된 텍스트를 맨 처음 출력하고 각 캡쳐 그룹에 대해 하나씩 항목을 갖는다. 이후에는 매치된 시작 인덱스(index), 전체 문장(input), named group 정보(groups)를 반환한다.
let regexp3 = /(?<val>\d+)(?<unit>.+\b)/g
let str3 = "그의 키는 169cm 이다."
let result3 = regexp3.exec(str3);
console.log(regexp3.lastIndex, result3)
String
match()
정규 표현식을 쓰기 위해 RegExp를 사용하는 것이 부담스럽다면 간단히 String이 가지는 메서드를 사용할 수도 있다. match는 문자열이 주어진 RegExp에 부합되는지를 판단하는 함수인데 상황에 따라 매우 다양한 값이 반환된다.
match되지 않는다면 null이 반환된다.
g flag를 가지고 match된 경우 match된 부분들을 배열로 반환한다.
g flag가 없이 match된 경우 exec()의 리턴 값과 같은 내용이 반환된다.
let str4 = "독도는 우리땅!"
console.log(str4.match(/[0-9]+/))
console.log(str4.match(/[가-힝]+/g))
console.log(str4.match(/[가-힝]+/))
replace(), replaceAll()
또한 replace() 또는 replaceAll()를 이용하면 정규 식에 맞는 문자들을 새 문자로 대체할 수 있다. 이 두 함수는 g flag 포함 여부에 따라 동작이 달라진다.
함수
g flag 미 포함
g flag 포함
replace()
처음 일치하는 내용 변경
모든 일치하는 내용 변경
replaceAll()
오류
모든 일치하는 내용 변경
const str5 = "I think Ruth's dog is cuter than your dog!";
const regexp5 = /dog/
console.log(str5.replace(regexp5, 'monkey'));
console.log(str5.replaceAll(regexp5, 'monkey'));
const str5 = "I think Ruth's dog is cuter than your dog!";
const regexp5 = /dog/g
console.log(str5.replace(regexp5, 'monkey'));
console.log(str5.replaceAll(regexp5, 'monkey'));