본문 바로가기
Javascript

Javascript - 정규식(RegExp)

by DGK 2021. 10. 2.

 

인프런 자바스크립트 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

정규식(RegExp)

 

  • 정규식이란?
정규식은 패턴을 통해 고차원적인 검색을 가능하게 하는 기능이다.

<기본 개념>
//문자열을 검색하는 함수에서의 정규식 사용여부 비교

//정규식을 사용하지 않는 경우

var str = "Hello World";

console.log(str.search("World"));

// 결과 : 6

//6은 찾고자 하는 문자열(World)이 시작하는 인덱스 번호를 의미한다.


console.log(str.search("world"));
 
// 결과 : -1
 
//여기서 -1은 검색 불가의 의미이다.
//world 문자열의 w가 소문자이기 때문에, 변수 str에서 찾지 못하는 것이다.
 
 
//정규식을 사용하는 경우

var str = "Hello World";
 
console.log(str.search(/World/i)); 

// 결과 : 6

//여기서 World는 정규식의 '패턴'으로 검색하고자 하는 키워드를 의미하며, 
//i는 정규식의 'modifier'로 대·소문자 상관없이 해당 키워드를 찾겠다는 의미이다.


console.log(str.search(/world/i));

// 결과 : 6

//정규식의 modifier 'i'를 사용하면, 대·소문자 상관없이 해당 키워드를 찾기 때문에
//검색이 가능하며 결과 값이 6으로 나온다.



//문자열을 교체하는 함수에서의 정규식 사용여부 비교

//정규식을 사용하지 않는 경우

var str = "Hello WORLD!, world!";

console.log(str.replace("world", "James"));

// 결과 : Hello WORLD!, James!

//대문자 WORLD는 교체하지 못하고, 소문자 world만 James로 교체한다.


//정규식을 사용하는 경우

var str = "Hello WORLD!, world!";

console.log(str.replace(/world/i, "James"));

// 결과 : Hello James!, world!

//대·소문자 상관없이 교체대상을 찾기는 하지만, 맨 처음 나오는 대상만을 교체한다.


console.log(str.replace(/world/ig, "James"));

// 결과 : Hello James!, James!

//대·소문자 상관없이, 모든 교체대상을 찾아서 교체한다.
//여기서 modifier 'g'를 사용하면, 해당되는 모든 대상에 관련 기능을 적용한다.



<응용 개념 : 정규식의 다양한 패턴>

var str = "Is this all there is";
var patt1 = /[hat]/g;              
var result = str.match(patt1);      

console.log(result);

// 결과 : ["t", "h", "a", "t", "h"]

//[abc]패턴은 대괄호안에 있는 글자 하나 하나(a, b, c)를 해당 문자열에서
//모두 찾겠다는 의미이다.

//여기서 match( ) 함수는 결과 값을 배열로 보여주는 함수이다.[정규식을 위한 함수]


var str = "123abc4562314kkk";
var patt1 = /[0-9]/g;               
var result = str.match(patt1);

console.log(result);

// 결과 : ["1", "2", "3", "4", "5", "6", "2", "3", "1", "4"]

//[0-9]패턴은 해당 문자열에서 0부터 9까지 모두 찾겠다는 의미이다.


var str = "Giva 100";
var patt1 = /\d/g;                  
var result = str.match(patt1);

console.log(result);

// 결과 : ["1", "0", "0"]

//\d패턴은 모든 숫자를 다 찾겠다는 의미이다.([0-9]패턴과 유사한 기능)


var str = "Giva 100";
var patt1 = /\s/g;                     
var result = str.match(patt1);

console.log(result);

// 결과 : [" "]

//\s패턴은 해당 문자열에서 공백을 찾겠다는 의미이다.


var str = "re, green, red, gree, gen, red, blue, yellow";
var patt1 = /(red|green)/g;        
var result = str.match(patt1);

console.log(result);

// 결과 : ["green", "red", "red"]

//(a|b)패턴은 a 혹은 b를 찾겠다는 의미이다.


var str = "HELLO, LOOk AT ME!";
var patt1 = /\bLO/g;                
var result = str.search(patt1);

console.log(result);

// 결과 : 7

//\b패턴은 \b뒤에 오는 글자로 시작하는 문자열을 찾겠다는 의미이다.

//\bLO이면 문자열의 시작이 'LO'인 문자열을 찾겠다는 의미이며, 
//해당 문자열의 시작점을 인덱스 번호로 알려준다.


var str = "Hellooo";
var patt1 = /o+/g;

console.log(str.match(patt1));

// 결과 : ["ooo"]

//+패턴은 +앞에 있는 문자가 1개 이상 있다면, 모두 찾겠다는 의미이다.


var str = "Hellooo World";
var patt1 = /lo*/g;

console.log(str.match(patt1));

// 결과 : ["l", "looo", "l"]

//*패턴은 *앞에 있는 문자(o)가 0개 또는 n개인 문자열을 모두 찾겠다는 의미이다.

//위의 결과는 lo에서 o가 0개이면 l이 되기 때문에 l을 찾는 것이며,
//o가 3개인 looo도 함께 찾는 것이다.


var str = "1, 100 or 1000";
var patt1 = /10?/g;

console.log(str.match(patt1));

// 결과 : ["1", "10", "10"]

//?패턴은 ?앞에 있는 문자(o)가 0개 혹은 1개인 문자열을 모두 찾겠다는 의미이다.

//위의 결과는 ?앞에 있는 문자(o)가 0개이면 1이 되기 때문에 1을 찾는 것이며,
//o가 1개이면 10이 되기 때문에 100과 1000을 모두 10으로 찾는 것이다.

 

 

  • 정규식 실무활용 예시

<우편번호 5자리가 모두 숫자인지 확인하는 정규식 코드>

var patt1 = /\d{5}/;            
var postalcode = "23452";

console.log(patt1.test(postalcode));

// 결과 : true

//\d의{ }안에 숫자는 숫자의 자리수를 의미한다.(즉, 5자리로 된 숫자를 찾겠다는 의미)

//test( ) 함수는 정규식 함수이므로, match( ), search( ) 함수와
//문법이 조금 다르다.

//patt1.test(postalcode)와 str.match(patt1)의 코드를 비교해볼 것


var patt1 = /\d{5}/;
var postalcode = "P24143Z";

console.log(patt1.test(postalcode));

// 결과 : true

//이 경우에도 true 값이 나온다.(해당 문자열에 5자리 숫자가 있기만 하면 true 값을 출력) 

//이러한 문제를 해결하기 위해서는 코드를 아래와 같이 수정해야 한다.


var patt1 = /^\d{5}$/;                      
var postalcode = "P24143Z";

console.log(patt1.test(postalcode));

// 결과 : false

//^는 무조건 ^뒤에 있는 것으로 시작해야 함을 의미하기 때문에,
//^\d는 숫자로 시작해야 함을 뜻한다.

//$는 $이 있는 위치에서 정규식을 끝내겠다는 것을 의미하기 때문에,
//^\d{5}$는 숫자로 시작하고 5자리의 숫자에서 정규식을 끝내겠다는 것을 뜻한다.

//숫자로 시작하지도 않고, 숫자 5자리로 끝나지도 않기 때문에 false 값이 나온 것이다.


var patt1  = /^\d{5}$/;
var postalcode = "48391";

console.log(patt1.test(postalcode));

// 결과 : true

//숫자로 시작하고, 숫자 5자리이기 때문에 true 값이 나온 것이다.



<전화번호가 010-1234-5678의 형태인지 확인하는 정규식 코드>

var patt1 = /^(010)-\d{4}-\d{4}$/;          
var tel = "010-2341-5354";

console.log(patt1.test(tel));

// 결과 : true

//^(010)은 010으로 시작하고 ( )안 숫자를 한 번에 비교하라는 의미이며,
//-\d{4}는 '-' 다음에 숫자 4자리가 나온다는 것을 의미하고,
//-\d{4}$는 '-' 다음에 숫자 4자리가 나오고 정규식이 끝난다는 것을 뜻하기 때문에,
//결과 값으로 true가 나온 것이다.


var patt1 = /^(010)-\d{4}-\d{4}$/;                       
var tel = "011-2341-5354";

console.log(patt1.test(tel));

// 결과 : false   

//010으로 시작하지 않기에, 결과 값으로 false가 나온 것이다.



<이메일 주소가 정확한 형식이 맞는지 확인하는 정규식 코드>

var patt1 = /^\w+([\.-]?\w+)*@\w+(\.\w{2,3})+$/;

console.log(patt1.test("abcde.1234@gmail.com"));   // 결과 : true
console.log(patt1.test(".1234@gmail.com"));        // 결과 : false
console.log(patt1.test("abcde1234@gmail.com"));    // 결과 : true
console.log(patt1.test("abcde1234@gmail.co.kr"));  // 결과 : true
console.log(patt1.test("abcde1234@.com"));         // 결과 : false

//해석

//\w패턴은 문자열을 의미하고 +패턴은 +앞에 문자가 1개 이상있다면 찾겠다는 의미이므로,
//^\w+는 최소 1개 이상의 문자로 시작하는 것을 찾겠다는 의미이다.

//( )는 한 묶음으로 보겠다는 것을 의미하고 ?패턴은 ?앞에 문자가 0개 또는 1개 있다면,
//찾겠다는 의미로 [\.-]?는 .과 -가 있을 수도 있고 없을 수도 있다는 의미이다.

//또한, +패턴은 +앞에 문자가 1개 이상 있다면 찾겠다는 의미이므로,
//([\.-]?\w+)는 .과 -가 있을 수도 있고 없을 수도 있다는 의미와 함께,
//[\.-]?와 \w+를 한 묶음으로 보면서 .과 -뒤에 문자열이 최소 1개가 있다면
//찾겠다는 의미이다.

//즉, ^\w+([\.-]?\w+)는 최소 1개 이상의 문자로 시작하며, 
//해당 문자 뒤에 .과 -가 최소 1개의 문자열과 함께 올 수 있다는 의미이다.
//(단, .앞에 \는 .이 특수문자이므로 .을 일반문자로 바꾸기 위해 사용한 것)

//한편, *패턴은 *앞에 있는 문자가 0개 또는 n개가 있다면 찾겠다는 의미이며,
//([\.-]?\w+)*는 ([\.-]?\w+)가 있을 수도 있고 없을 수도 있다는 의미이다.

//@\w+(\.\w{2,3})+$는 @가 나오고 그 뒤에 최소 1개의 문자열이 나온 후,
//(\.\w{2,3})가 최소 1개 이상 나오고(1번 이상 반복) 그 이후에 정규식을
//끝내겠다는 의미이다.

//참고로 (\.\w{2,3})은 일반문자 .뒤에 2자리 혹은 3자리의 문자열이 온다는 의미로,
//.과 \w{2,3}를 한 묶음으로 보겠다는 의미이다.
//(단, 여기서 \w{ }의 { }안 숫자는 문자열의 자리수를 의미)

'Javascript' 카테고리의 다른 글

Javascript - HTML 이벤트 컨트롤  (0) 2021.10.02
Javascript - HTML Element 컨트롤  (0) 2021.10.02
Javascript - Strict Mode  (0) 2021.10.01
Javascript - Error(try, catch, finally)  (0) 2021.10.01
Javascript - 클래스(Class)  (0) 2021.10.01

댓글