본문 바로가기

정규표현식

1. 정규표현식

정규표현식(Regular Expressions)은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용되는 문자열 패턴입니다. 대부분의 프로그래밍 언어에서 문법으로 지원합니다.

Computer Science는 어렵다. 그 중에서도 정규표현식이 가장 어렵다.

이런 말이 있을 정도로 정규표현식은 어렵습니다. 하지만 정규표현식을 사용하면 URL 파싱, 해시태그 추출, 이메일 형식 검증 등 문자열을 더욱 쉽게 다룰 수 있습니다.

정규표현식 | 사도출판
let number = "010-1234-5678";
let pattern = /\d{2,3}-\d{3,4}-\d{4}/;

console.log(pattern.test(number));

2. 정규표현식 구조

정규표현식은 기본적으로 아래와 같은 형태를 가집니다.

const regex = /패턴/플래그;
const regex = new RegExp('패턴', '플래그');

2.1. 플래그

플래그는 정규표현식의 동작 방식을 지정합니다.

플래그설명
g전역 검색
i대소문자 구분 없이 검색
m여러 줄 검색
let text =`Hello world!
Hello World!
  hello WORLD!
hello world!
`;

console.log('--- g 플래그 ---');
console.log(text.match(/Hello/));
console.log(text.match(/Hello/g));

console.log('--- i 플래그 ---');
console.log(text.match(/Hello/g));
console.log(text.match(/Hello/gi));

console.log('--- m 플래그 ---');
console.log(text.match(/^Hello/gi));
console.log(text.match(/^Hello/gim));

2.2. 패턴

패턴은 찾고자 하는 문자열의 규칙을 나타냅니다.

패턴설명
a-za부터 z까지의 문자
A-ZA부터 Z까지의 문자
가-힣한글 음절
0-90부터 9까지의 숫자
let text = "abc ABC 가나다 1234 !@#";

console.log(text.match(/[a-z]/g));    // ["a", "b", "c"]
console.log(text.match(/[A-Z]/g));    // ["A", "B", "C"]
console.log(text.match(/[가-힣]/g));   // ["가", "나", "다"]
console.log(text.match(/[0-9]/g));    // ["1", "2", "3", "4"]
패턴설명
\s공백 문자
\b문자와 공백 사이
\t탭 문자
\d숫자 [0-9]와 같다.
\w단어 영문자 + 숫자 + (밑줄) [0-9a-zA-Z]
let text = "abc ABC 가나다 1234 !@#";

console.log(text.match(/\s/g));       // [" "]
console.log(text.match(/\b/g));       // (공백과 단어 경계의 위치이므로 일치하는 위치를 찾지 못함)
console.log(text.match(/\t/g));       // (탭 문자가 없으므로 일치하지 않음)
console.log(text.match(/\d/g));       // ["1", "2", "3", "4"]
console.log(text.match(/\w/g));       // ["a", "b", "c", "A", "B", "C", "1", "2", "3", "4", "_"] (영문자, 숫자, 밑줄 포함)

// 대문자로 나타내면 반대의 의미를 가집니다.
console.log(text.match(/\S/g));
console.log(text.match(/\B/g));
console.log(text.match(/\D/g));
console.log(text.match(/\W/g));
패턴설명
.임의의 한 문자
^문자열의 시작
$문자열의 끝
[]문자 클래스
[^]부정 문자 클래스. 문자 클래스 안에서 ^은 not으로 동작
[-]문자 범위
let exampleText = "Example.";

console.log(exampleText.match(/./g));
console.log(exampleText.match(/^e/g));
console.log(exampleText.match(/.$/g));
console.log(exampleText.match(/[ex]/g));
console.log(exampleText.match(/[^ex]/g));
console.log(exampleText.match(/[e-x]/g));

패턴설명
?앞 문자가 없거나 하나 있음. {0,1}
+앞 문자가 최소 하나 이상 연속. {1,}
*앞 문자가 0개 이상 연속. {0,}
|OR 연산자
{n,m}앞 문자가 n개 이상 m개 이하
{n,}앞 문자가 n개 이상
{n}앞 문자가 정확히 n개
()하나의 패턴구분자 안에 서브 패턴을 지정
let repeatText = "aabbcc123";

console.log(repeatText.match(/a?/g));
console.log(repeatText.match(/b+/g));
console.log(repeatText.match(/c*/g));
console.log(repeatText.match(/(a|1)/g));
console.log(repeatText.match(/a{2,3}/g));
console.log(repeatText.match(/b{2,}/g));
console.log(repeatText.match(/c{2}/g));

// javascript 정규표현식에서는 그룹을 구분하지 않음
let value = 'monday, tuesday, wednesday, thursday, friday, saturday, sunday';
value.match(/(on|ues|rida)/gm);
value.match(/(on|ues)|(rida)/gm);

2.3. 정규표현식 메서드

정규표현식 메서드를 이용하여 패턴을 검색할 수 있습니다. 또 문자열 메서드와 함께 사용되어 문자열을 검색하거나 변환할 수 있습니다.

  1. test(): 문자열이 정규표현식과 일치하는지 검사하고 결과를 true 또는 false로 반환합니다.

     let pattern = /\d{2,3}-\d{3,4}-\d{4}/;
     pattern.test('010-1234-5678'); // true
     pattern.test('01012345678'); // false
    
  2. exec(): 문자열에서 정규표현식과 일치하는 문자열을 검색하고, 일치하는 문자열을 배열로 반환합니다.

    let pattern = /[A-Z]/;
    pattern.exec('Hello Weniv'); // 'H'
    
  3. match(): 문자열에서 정규표현식과 일치하는 문자열을 검색하고, 일치하는 문자열을 배열로 반환합니다.

    let pattern = /[A-Z]/g;
    'Hello Weniv'.match(pattern); // ['H', 'W']
    
  4. replace(): 문자열에서 정규표현식과 일치하는 문자열을 찾아 다른 문자열로 대체합니다.

    let pattern = /[A-Z]/g;
    'Hello Weniv'.replace(pattern, '👋'); // '👋ello 👋eniv'
    
  5. split(): 문자열을 정규표현식을 기준으로 나누어 배열로 반환합니다.

    let pattern = /[\s,]+/;
    'Hello, Weniv'.split(pattern); // ['Hello', 'Weniv']
    

3. 정규표현식의 활용

정규표현식은 단순히 패턴을 찾는 것을 넘어서, 복잡한 문자열 조작, 유효성 검증, 텍스트 추출 등 다양한 용도로 활용됩니다. 정규표현식을 어떻게 활용할 수 있는지 알아보겠습니다.

3.1. 문자열 추출

특정 패턴을 가진 문자열을 추출할 수 있습니다.

// 해시태그 추출
let post = "#개발 강의는 역시 #위니브!";
let hashtags = post.match(/#[\w가-힣]+/g);
console.log(hashtags); // ["#개발", "#위니브"]

// 숫자 추출
let mixed = "The price is 100 dollars and 50 cents.";
let numbers = mixed.match(/\d+/g);
console.log(numbers); // ["100", "50"]

3.2. 문자열 치환 및 조작

정규표현식을 사용하여 특정 패턴의 문자열을 찾아서 다른 문자열로 치환하거나, 특정 패턴을 기준으로 문자열을 분리할 수 있습니다.

// 특정 문자 제거
let s = '01324908123930';
console.log(s.replace(/[^1-9]/g, ''));
console.log(s.replace(/[0]/g, ''));
console.log(s.replace(/0/g, ''));

// 문자열 앞 공백 제거
s = '   010100020201020304812123    ';
console.log(s.replace(/^\s+/g, ''));

// 개행 제거
s = `
hello world
hello weniv
hello javascript
`;
console.log(s.replace(/\n/g, ''));

// 여러 구분자를 이용한 문자열 추출
s = "apple, orange; banana grape";
console.log(s.split(/[ ,;]+/))

3.3. 패턴 검증

정규표현식은 특정 문자열이 주어진 패턴에 맞는지 여부를 검증하는 데 자주 사용됩니다.

// email
let emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;

console.log(emailPattern.test('test@example.com')); // true
console.log(emailPattern.test('invalid-email@com')); // false

// password
let pwPattern = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).{8,}$/;

console.log(pwPattern.test('P@ssw0rd'));
console.log(pwPattern.test('password'));


[JS] 📚 정규식 (RegExp) - 누구나 이해하기 쉽게 정리 정규 표현식 - JavaScript | MDN
정규표현식 - JavaScript 에센셜 | 위니버시티