정규표현식

정규 표현식 - JavaScript

  • -

이번 포스트에서는 JavaScript에서 정규 표현식을 처리에 대해 알아보자.

 

RegExp

 

RegExp 생성

자바스크립트에서 정규표현식을 처리하기 위해서는 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가 업데이트 된다는 점이다. 

RegExp의 lastIndex와 test()

 

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'));

replaceAll()은 g flag가 필요하다.

 

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'));

 

'정규표현식' 카테고리의 다른 글

\b와 \B의 차이  (0) 2021.01.04
정규 표현식 - SQL  (0) 2020.06.13
정규 표현식 - Java  (0) 2020.06.11
정규 표현식 - 유용한 표현들  (1) 2020.06.10
정규 표현식 - 메타문자  (0) 2020.06.10
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.