본문 바로가기

JavaScript/기본 이론

Chapter 18. 정규 표현식 (데이터의 문자열 검색 및 추출)

1. 개요 

 정규 표현식(regular expression)은 문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴을 말한다. 검색 패턴은 모든 종류의 문자열 검색이나 교체 등의 작업에서 사용이 가능하다. 

 

 

2. 정규 표현식의 생성 

 정규 표현식은 리터럴을 사용하여 생성하거나 이미 정의된 RegExp 객체를 이용하여 생성할 수 있다. 

 

var regStr = /a+bc/;     // 정규 표현식 리터럴을 이용한 생성
var regObj = new RegExp("a+bc"); // RegExp 객체를 이용한 생성
regStr;                          // /a+bc/
regObj;                          // /a+bc/

 

 

3. 단순한 패턴 검색 

 정규 표현식을 사용하여 단순한 패턴을 검색하고자 할 때는, 찾고자하는 문자열을 직접 나열하면 된다. 

 

var targetStr = "간장 공장 공장장은 강 공장장이고, 된장 공장 공장장은 장 공장장이다."
var strReg1 = /공장/;
var strReg2 = /장공/;
 
targetStr.search(strReg1); // 3
targetStr.search(strReg2); // -1



4. 플래그(flags)

 플래그는 정규 표현식 검색에 특정 조건을 포함하는 방식을 말한다. 

 

플래그(flag) 설명
i 검색 패턴을 비교할 때 대소문자를 구분하지 않도록 설정함.
g 검색 패턴을 비교할 때 일치하는 모든 부분을 선택하도록 설정함.
m 검색 패턴을 비교할 때 여러 줄의 입력 문자열을 그 상태 그대로 여러 줄로 비교하도록 설정함.
y 대상 문자열의 현재 위치부터 비교를 시작하도록 설정함.
 
var targetStr = "간장 공장 공장장은 강 공장장이고, 된장 공장 공장장은 장 공장장이다."
var strReg1 = /공장/;
var strReg2 = /장공/;
 
targetStr.search(strReg1); // 3
targetStr.search(strReg2); // -1

 

 

5. 특수 문자(special characters)

 정규 표현식을 사용하여 단순한 패턴의 검색은 문자열을 나열하는 것으로 충분히 가능하다. 하지만 숫자, 띄어쓰기 등을 검색하는 것은 더 복잡한 특수 문자를 사용해야 한다. 

 

특수 문자 설명
\ 역슬래시(\) 다음에 일반 문자가 나오면 이스케이프 문자로 해석하고, 특수 문자가 나오면 일반 문자로 해석함.
\d 숫자를 검색함. /[0-9]/와 같음.
\D 숫자가 아닌 문자를 검색함. /[^0-9]/와 같음
\w 언더스코어(_)를 포함한 영문자 및 숫자를 검색함. /[A-Za-z0-9_]/와 같음.
\W 언더스코어(_), 영문자, 숫자가 아닌 문자를 검색함. /[^A-Za-z0-9_]/와 같음.
\s 띄어쓰기, 탭, 줄 바꿈 문자 등의 공백 문자를 검색함.
\S 띄어쓰기, 탭, 줄 바꿈 문자 등의 공백 문자가 아닌 문자를 검색함.
\b 단어의 맨 앞이나 맨 뒤가 패턴과 일치하는지를 검색함.
\xhh 16진수 hh에 해당하는 유니코드 문자를 검색함.
\uhhhh 16진수 hhhh에 해당하는 유니코드 문자를 검색함.
 
 
// 예제 1) 
var targetStr = "ab1bc2cd3de";
var reg1 = /\d/;    // 2 -> 0부터 9까지의 숫자를 검색함.
var reg2 = /[3-9]/; // 8 -> 3부터 9까지의 숫자를 검색함.

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

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

6. 양화사(quantifier)

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

 

괄호 설명
n* 바로 앞의 문자가 0번 이상 나타나는 경우를 검색함. /{0, }/와 같음.
n+ 바로 앞의 문자가 1번 이상 나타나는 경우를 검색함. /{1, }/과 같음.
n? 바로 앞의 문자가 0번 또는 1번만 나타나는 경우를 검색함. /{0,1}/과 같음.
 
// 예제)
var targetStr = "Hello World!";
var zeroReg = /lo*/;          // 문자 'l' 다음에 문자 'o'가 0번 이상 나타나는 경우를 검색함.
var oneReg = /lo+/;       // 문자 'l' 다음에 문자 'o'가 1번 이상 나타나는 경우를 검색함.
var zeroOneReg = /lo?/;       // 문자 'l' 다음에 문자 'o'가 0 또는 1번만 나타나는 경우를 검색함.
 
targetStr.search(zeroReg);    // 2
targetStr.search(oneReg);     // 3
targetStr.search(zeroOneReg); // 2

 

 

7. 괄호(bracket)

괄호 설명
a(b)c 전체 패턴을 검색한 후에 괄호 안에 명시된 문자열을 저장함. (ex : "abc"를 검색한 후에 b를 저장함.)
[abc] 꺾쇠 괄호([]) 안에 명시된 문자를 검색함. (ex : "abc"를 검색함.)
[0-3] 꺾쇠 괄호([]) 안에 명시된 숫자를 검색함. (ex : 0부터 3까지의 숫자를 검색함.)
[\b] 백스페이스 문자를 검색함.
{n} 앞의 문자가 정확히 n번 나타나는 경우를 검색함. n은 반드시 양의 정수이어야만 함.
{m,n} 앞의 문자가 최소 m번 이상 최대 n번 이하로 나타나는 경우를 검색함. m과 n은 반드시 양의 정수이어야만 함.
 
// 예제)
var targetStr = "Hong Gil Dong";
var nameReg = /(\w+)\s(\w+)\s(\w+)/;     // 공백 문자를 기준으로 각 부분문자열을 저장함.
var engName = targetStr.replace(nameReg, "$2 $3 $1"); // 첫 번째 부분문자열을 맨 마지막으로 위치시킴.
engName;



8. 위치 문자

괄호 설명
^a 단어의 맨 앞에 위치한 해당 패턴만을 검색함. (ex : 'a'로 시작하는 단어의 'a'만을 검색함.)
a$ 단어의 맨 뒤에 위치한 해당 패턴만을 검색함. (ex : 'a'로 끝나는 단어의 'a'만을 

 

// 예제)
var firstStr = "Php";
var secondStr = "phP";
var strReg = /^p/;       // 'p'로 시작하는 단어의 'p'만을 검색함.
firstStr.match(strReg);  // null
secondStr.match(strReg); // p

 

 

9. RegExp 객체

 RegExp 객체는 정규 표현식을 구현한 자바스크립트 표준 내장 객체이다. 모든 RegExp 인스턴스는 RegExp.prototype으로부터 메소드와 프로퍼티를 상속받는다. 상속받은 RegExp.prototype 메소드를 사용하여 정규 표현식을 표현할 수 있다.

 

메소드 설명
exec() 인수로 전달된 문자열에서 특정 패턴을 검색하여, 패턴과 일치하는 문자열을 반환함.
test() 인수로 전달된 문자열에 특정 패턴과 일치하는 문자열이 있는지를 검색하여, 그 결과를 불리언 값으로 반환함.
toString() RegExp 객체의 정규 표현식과 같은 의미를 가지는 정규 표현식 리터럴 문자열을 반환함.

 

RegExp.prototype 프로퍼티는 다음과 같다. 

 

프로퍼티 설명
global 검색 패턴을 비교할 때 일치하는 모든 부분을 선택하도록 설정하는 플래그인 'g'를 가리킴.
ignoreCase 검색 패턴을 비교할 때 대소문자를 구분하지 않도록 설정하는 플래그인 'i'를 가리킴.
multiline 검색 패턴을 비교할 때 여러 줄의 입력 문자열을 그 상태 그대로 여러 줄로 비교하도록 설정하는 플래그인 'm'을 가리킴.
source 검색 패턴이 포함하고 있는 문자열을 가리킴.
 

 

// 예제 1: exec() 메소드) 
var targetStr = "abbcdefabgh";
var firstResult = /ab+/.exec(targetStr);    // 패턴과 일치하는 문자열이 여러 개인 경우
var secondResult = /abbb+/.exec(targetStr); // 패턴과 일치하는 문자열이 하나도 없는 경우
firstResult;  // abb -> 가장 맨 처음으로 일치하는 문자열이 반환됨.
secondResult; // null

// 예제 2: test() 메소드 ) 
var targetStr = "abbcdefabgh";
var firstResult = /ab+/.test(targetStr);    // 패턴과 일치하는 문자열이 여러 개인 경우
var secondResult = /abbb+/.test(targetStr); // 패턴과 일치하는 문자열이 하나도 없는 경우
firstResult;  // true
secondResult; // false

'JavaScript > 기본 이론' 카테고리의 다른 글

Chapter 19. 표준 객체  (0) 2021.12.07
Chapter 17. 예외처리  (0) 2021.12.06
Chapter 16. 이벤트  (0) 2021.12.02
Chapter 15. 브라우저 객체 모델 (BOM)  (0) 2021.12.01
Chapter 14. Document Object Model  (0) 2021.11.30