WeniVooks

검색

JavaScript 에센셜

정규표현식

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('패턴', '플래그');
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-z a부터 z까지의 문자
A-Z A부터 Z까지의 문자
가-힣 한글 음절
0-9 0부터 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
13장 정규표현식14장 최적화 (Optimization)