Language/Javascript

[Javascript] 자바스크립트 표준 객체 - RegExp 객체와 메소드

재은초 2023. 8. 2. 22:28
반응형

정규 표현식(regular expression)이란?

  • 정규 표현식은 문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴이다.
  • 이런 검색 패턴은 모든 종류의 문자열 검색이나 교체 등의 작업에서 사용할 수 있다.

정규 표현식의 생성

  • 정규 표현식 리터럴을 이용한 생성이나 RegExp 객체를 이용한 생성으로 자바스크립트에서 정규 표현식을 만들 수 있다.
  • 정규 표현식 리터럴은 슬래시 / 기호로 시작하여 슬래시 / 기호로 끝나며, 필요에 따라 플래그를 추가하여 기본 검색 설정을 변경할 수도 있다.
/검색패턴/플래그
var regStr = /a+bc/;             // 정규 표현식 리터럴을 이용한 생성
var regObj = new RegExp("a+bc"); // RegExp 객체를 이용한 생성

regStr;                          // /a+bc/
regObj;                          // /a+bc/

단순한 패턴 검색

  • 정규 표현식을 사용하여 단순한 패턴을 검색하고자 할 때는 찾고자 하는 문자열을 직접 나열하면 된다.
// search() 메소드는 일치하는 문자열 중 첫번째 문자열의 인덱스만 반환하고 없으면 -1 반환
var targetStr = "간장 공장 공장장은 강 공장장이고, 된장 공장 공장장은 장 공장장이다."
var strReg1 = /공장/;
var strReg2 = /장공/;

targetStr.search(strReg1); // 3
targetStr.search(strReg2); // -1

플래그(flags)

  • 정규 표현식을 생성할 때 플래그를 사용하여 기본 검색 설정을 변경할 수 있는데, 설정된 플래그는 나중에 추가되거나 삭제될 수 없다.
  • 플래그는 옵션이므로 선택적으로 사용한다. 플래그를 사용하지 않은 경우 문자열 내 검색 매칭 대상이 1개 이상이더라도 첫번째 매칭한 대상만을 검색하고 종료한다.

var targetStr = "bcabcAB";
var strReg = /AB/;                 // 검색 패턴 비교시 기본 설정으로 대소문자 구분
var strUsingFlag = /AB/i;          // new RegExp("AB", "i")와 동일

targetStr.search(strReg);          // 5
targetStr.search(strUsingFlag);    // 2 -> 대소문자를 구분하지 않고 검색

특수 문자(special characters)

  • 정규 표현식을 사용하여 단순한 패턴을 검색하고자 할 때는 찾고자 하는 문자열을 직접 나열하면 되지만, 숫자만을 검색하거나 띄어쓰기를 찾는 등 정확히 일치하는 패턴보다 더 복잡한 조건을 사용하려면 특수 문자를 사용해야 한다.
  • 자바스크립트에서는 언더스코어(_)와 영문자, 숫자만을 단어에 포함될 수 있는 문자로 인식하므로, 이 외의 모든 문자는 문자열에서 단어를 구분하는 문자(word break)로 인식된다.

var targetStr = "ab1bc2cd3de";
var reg1 = /\d/;              // 2 -> 0부터 9까지의 숫자를 검색
var reg2 = /[3-9]/;           // 8 -> 3부터 9까지의 숫자를 검색


// 공백 문자를 사이에 두는 언더스코어(_)를 포함한 영문자 및 숫자로 이루어진 문자열 검색
var targetStr = "abc 123";
var reg = /\w\s\w/;           // c 1


// 단어의 맨 앞이나 맨 뒤에 부분 문자열 bc가 존재하는지를 검색
var targetStr1 = "abc123abc";   // 7
var targetStr2 = "abc 123 abc"; // 1
var targetStr3 = "abc@123!abc"; // 1
var reg = /bc\b/;

양화사(quantifier)

  • 정규 표현식에서는 특수 문자로 수량을 나타내는 다양한 양화사를 사용할 수 있다.

var targetStr = "Hello World!";
// 문자 'l' 다음에 문자 'o'가 0번 이상 나타나는 경우를 검색
var zeroReg = /lo*/;          
// 문자 'l' 다음에 문자 'o'가 1번 이상 나타나는 경우를 검색
var oneReg = /lo+/;           
// 문자 'l' 다음에 문자 'o'가 0 또는 1번만 나타나는 경우를 검색
var zeroOneReg = /lo?/;       

targetStr.search(zeroReg);    // 2
targetStr.search(oneReg);     // 3
targetStr.search(zeroOneReg); // 2
  • 물음표 ? 기호가 정규 표현식의 양화사 * + ? {} 바로 다음에 위치하면, 가능한 많은 문자를 가지도록 패턴을 찾는 기본 설정과는 달리 해당 양화사가 가능한 적은 수의 문자만을 가지는 패턴을 찾도록 변경시킨다.
var targetStr = "123abc";
var oneReg = /\d+/;           // 숫자 검색하며 /[0-9]/와 같음
var anotherReg = /\d+?/;      // 숫자 검색하지만 가능한 적은 수의 문자 패턴을 검색

targetStr.search(oneReg);     // 123
targetStr.search(anotherReg); // 1

괄호(bracket)

  • \b는 단어의 맨 앞이나 맨 뒤가 패턴과 일치하는지를 검색하는 특수 문자이고, [\b]는 백스페이스 문자를 검색하는 정규표현식이다.
  • 괄호로 묶여진 정규 표현식으로 검색되는 부분 문자열은 차례대로 저장되는데, replace() 메소드에서는 이렇게 저장된 문자열을 $1, $2, .., $n 이렇게 사용하거나 정규 표현식 내부에서 바로 사용할 수도 있다.
/* 괄호()로 패턴 검색하고 해당 패턴을 저장하여 위치 변경 */

var targetStr = "Hong Gil Dong";
// 공백 문자를 기준으로 각 부분 문자열을 저장
var nameReg = /(\w+)\s(\w+)\s(\w+)/;                  
// 첫번째 부분문자열을 맨 마지막으로 위치
var engName = targetStr.replace(nameReg, "$2 $3 $1"); 

engName;                             // Gil Dong Hong
// match() 메소드는 정규 표현식과 모두 일치하는 부분 문자열뿐만 아니라 괄호를 사용하여 저장된 부분 문자열도 함께 반환

var targetStr = "abc 123 abc 123";
var oneReg = /(\w+) (\d+)/;
var anotherReg = /(\w+) (\d+) \1 \2/;

targetStr.match(oneReg);     // abc 123, abc, 123
targetStr.match(anotherReg); // abc 123 abc 123, abc, 123

위치 문자

  • 정규 표현식에서는 패턴을 검색할 단어의 위치를 지정할 수 있다.

var firstStr = "Php";
var secondStr = "phP";
var strReg = /^p/;       // 'p'로 시작하는 단어의 'p'만을 검색

firstStr.match(strReg);  // null
secondStr.match(strReg); // p

 

RegExp 객체

  • RegExp 객체는 정규 표현식을 구현한 자바스크립트 표준 내장 객체다.
  • 검색 패턴을 나타내는 정규 표현식은 따옴표나 슬래시 /로 감싸야 하며, 기본 검색 설정을 변경할 수 있는 플래그는 필요할 때만 전달할 수 있다.
/* RegExp 객체 생성 */
new RegExp(검색패턴[, 플래그]);

 

RegExp.prototype 프로퍼티

 

RegExp.prototype 메소드

exec() 메소드

  • exec() 메소드는 인수로 전달된 문자열에서 특정 패턴을 검색하여 패턴과 일치하는 문자열을 반환하며, 만약에 패턴과 일치하는 문자열이 없으면 null을 반환한다.
var targetStr = "abbcdefabgh";
// 패턴과 일치하는 문자열이 여러 개인 경우
var firstResult = /ab+/.exec(targetStr);    
// 패턴과 일치하는 문자열이 하나도 없는 경우
var secondResult = /abbb+/.exec(targetStr); 

firstResult;           // abb -> 가장 맨 처음으로 일치하는 문자열이 반환
secondResult;          // null

test() 메소드

  • test() 메소드는 인수로 전달된 문자열에 특정 패턴과 일치하는 문자열이 있는지를 검색하며, 만약에 패턴과 일치하는 문자열이 있으면 true를 없으면 false를 반환한다.
var targetStr = "abbcdefabgh";
// 패턴과 일치하는 문자열이 여러 개인 경우
var firstResult = /ab+/.test(targetStr);    
// 패턴과 일치하는 문자열이 하나도 없는 경우
var secondResult = /abbb+/.test(targetStr); 

firstResult;                      // true
secondResult;                     // false

toString() 메소드

  • RegExp 객체의 정규 표현식과 같은 의미를 가지는 정규 표현식 리터럴 문자열을 반환한다.

 

Reference

반응형