[TCP School/자바스크립트] 정규 표현식 - 정규 표현식의 응용

2023. 4. 27. 13:35

특수 문자

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

하지만 숫자만을 검색하거나, 띄어쓰기를 찾는 등 정확히 일치하는 패턴보다 더 복잡한 조건을 사용하려면 특수 문자를 사용해야 한다.

 

자바스크립트의 정규 표현식에서 사용할 수 있는 대표적인 특수 문자는 다음과 같다.

특수 문자 설명
\ 역슬래시(\) 다음에 일반 문자가 나오면 이스케이프 문자로 해석하고, 특수 문자가 나오면 일반 문자로 해석함
\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에 해당하는 유니코드 문자를 검색함

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>\d</title>
</head>
<body>
    <h1>특수 문자 \d</h1>
    <p id="text"></p>

    <script>
        var text = document.getElementById('text');

        var targetStr = 'ab1bc2cd3de';
        var reg1 = /\d/;
        var reg2 = /[3-9]/;

        text.innerHTML = targetStr.search(reg1) + '<br>';
        text.innerHTML += targetStr.search(reg2);
    </script>
</body>
</html>

 

위 예제에서 첫 번째 정규 표현식은 0부터 9까지의 숫자인지를 검색한다.

두 번째 정규 표현식은 3부터 9까지의 숫자인지를 검색한다.

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>\s, \w</title>
</head>
<body>
    <h1>특수 문자 \s와 \w</h1>
    <p id="text"></p>

    <script>
        var text = document.getElementById('text');

        var targetStr = 'abc 123';
        var reg = /\w\s\w/;

        text.innerHTML = targetStr.match(reg);
    </script>
</body>
</html>

 

위 예제에서 사용된 정규 표현식은 첫 번째 문자로 언더스코어(_)를 포함한 영단어 및 숫자를 검색한다.

두 번째 문자로는 띄어쓰기를 포함한 탭, 줄 바꿈 문자 등의 공백 문자를 검색한다.

마지막 세 번째 문자는 첫 번째 문자와 같다.

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>\b</title>
</head>
<body>
    <h1>특수문자 \b</h1>
    <p id="text"></p>

    <script>
        var text = document.getElementById('text');

        var targetStr1 = 'abc123abc';
        var targetStr2 = 'abc 123 abc';
        var targetStr3 = 'abc@123!abc';

        var reg = /bc\b/;

        text.innerHTML = targetStr1.search(reg) + '<br>';
        text.innerHTML += targetStr2.search(reg) + '<br>';
        text.innerHTML += targetStr3.search(reg);
    </script>
</body>
</html>

 

특수 문자 '\b'를 사용한 정규 표현식은 단어의 가장 앞이나 가장 뒤가 패턴과 일치하는지를 검색한다.

위의 예제에서 첫 번째 문자열은 정규 표현식이 하나의 단어로 인식하고, 양 끝에 위치한 패턴을 검색한다.

두 번째 문자열과 세 번째 문자열은 정규 표현식이 여러 개의 단어로 인식하고, 모든 단어에 대해 패턴을 검색한다.

 

자바스크립트에서는 언더스코어(_)와 영문자, 숫자만을 단어에 포함할 수 있는 문자로 인식한다.

따라서 이 외의 모든 문자는 문자열에서 단어를 구분하는 문자로 인식된다.


양화사(quantifier)

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

괄호 설명
n* 바로 앞의 문자가 0번 이상 나타나는 경우를 검색함. /{0, }/와 같음
n+ 바로 앞의 문자가 1번 이상 나타나는 경우를 검색함. /{1, }/와 같음
n? 바로 앞의 문자가 0번 또는 1번만 나타나는 경우를 검색함. /{0, 1}/와 같음

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>quantifier</title>
</head>
<body>
    <h1>정규 표현식의 양화사</h1>
    <p id="text"></p>

    <script>
        var targetStr = 'Hello World!';
        var zeroReg = /lo*/;
        var oneReg = /lo+/;
        var zeroOneReg = /lo?/;

        document.getElementById('text').innerHTML = targetStr.search(zeroReg) + '<br>' + targetStr.search(oneReg) + '<br>' + targetStr.search(zeroOneReg);
    </script>
</body>
</html>

 

 

또한, 물음표(?) 기호가 정규 표현식의 양화사 바로 다음에 위치하게 되면, 가능한 많은 문자를 가지도록 패턴을 찾는 기본 설정과는 달리 해당 양화사가 가능한 적은 수의 문자만을 가지는 패턴을 찾도록 변경시킨다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>quantifier2</title>
</head>
<body>
    <h1>정규 표현식의 양화사</h1>
    <p id="text"></p>

    <script>
        var targetStr = '123abc';
        var oneReg = /\d+/;
        var anotherReg = /\d+?/;

        document.getElementById('text').innerHTML = targetStr.match(oneReg) + '<br>' + targetStr.match(anotherReg);
    </script>
</body>
</html>

 

위 예제에서 첫 번째 정규 표현식은 하나 이상의 숫자만을 검색하므로, 문자열 '123abc'에서 가능한 많은 문자를 가지도록 '123'을 검색한다.

하지만 두 번째 정규 표현식처럼 바로 뒤에 물음표 기호를 추가하면, 가능한 적은 문자를 가지도록 변경되므로, '1'만 검색하게 된다.


괄호(bracket)

정규 표현식에서 사용할 수 있는 여러 가지 괄호의 의미는 다음과 같다

괄호 설명
a(b)c 전체 패턴을 검색한 후에 괄호 안에 명시된 문자열을 저장(ex : 'abc'를 검색한 후에 b를 저장)
[abc] 꺽쇠 괄호 안에 명시된 문자를 검색
[0-3] 꺽쇠 괄호 안에 명시된 숫자를 검색
[\b] 백스페이스 문자를 검색
{n} 앞의 문자가 정확히 n번 나타나는 경우를 검색. n은 반드시 양의 정수여야 함.
{m, n} 앞의 문자가 최소 m번 이상 최대 n번 이하로 나타나는 경우를 검색. m과 n은 반드시 양의 정수여야 함. 

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>bracket</title>
</head>
<body>
    <h1>정규 표현식의 괄호</h1>
    <p id="text"></p>

    <script>
        var targetStr = 'Hong Gil Dong';
        var nameReg = /(\w+)\s(\w+)\s(\w+)/;
        var engName = targetStr.replace(nameReg, '$2 $3 $1');
        document.getElementById('text').innerHTML = engName;
    </script>
</body>
</html>

 

위 예제에서 괄호로 묶여진 정규 표현식으로 검색되는 세 개의 부분 문자열은 차례대로 저장된다.

이 때 replace() 메소드에는 이렇게 저장된 부분 문자열을 $1, $2, $3, ... 표현을 이용하여 사용할 수 있다.

 

이렇게 저장된 부분 문자열은 replace() 메소드에서 사용할 수도 있지만, 정규 표현식 내부에서 바로 사용할 수도 있다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>bracket2</title>
</head>
<body>
    <h1>정규 표현식의 괄호</h1>
    <p id="text"></p>

    <script>
        var targetStr = 'abc 123 abc 123';
        var oneReg = /(\w+) (\d+)/;
        var anotherReg = /(\w+) (\d+) \1 \2/;

        document.getElementById('text').innerHTML = targetStr.match(oneReg) + '<br>' + targetStr.match(anotherReg);
    </script>
</body>
</html>

 

위 예제에서 첫 번째 정규 표현식은 언더스코어(_)를 포함한 영문자 및 숫자로 이루어진 한 부분 문자열과 띄어쓰기로 구분되는 숫자로 이루어진 또 다른 부분 문자열을 검색한다.

따라서 해당 문자열에서는 각각 첫 번째 'abc'와 '123'이 검색되어 저장된다.

하지만 두 번째 정규 표현식에서는 위와 같은 방법으로 저장된 부분 문자열을 정규 표현식 내에서 다시 사용하고 있다.

이 때 정규 표현식 내에서는 \1, \2, \3, ... 표현을 사용하여 저장된 부분 문자열을 다시 사용할 수 있다.


위치 문자

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

괄호 설명
^a 단어의 가장 앞에 위치한 해당 패턴만을 검색
a$ 단어의 가장 뒤에 위치한 해당 패턴만을 검색

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>^$</title>
</head>
<body>
    <h1>정규 표현식의 위치 문자</h1>
    <p id="text"></p>

    <script>
        var firstStr = 'Php';
        var secondStr = 'phP';
        var strReg = /^p/;

        document.getElementById('text').innerHTML = firstStr.match(strReg) + '<br>' + secondStr.match(strReg);
    </script>
</body>
</html>

 


TCP School의 강의 내용을 정리한 포스트입니다.

http://www.tcpschool.com/javascript/intro

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

BELATED ARTICLES

more