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. 정규표현식 메서드
정규표현식 메서드를 이용하여 패턴을 검색할 수 있습니다. 또 문자열 메서드와 함께 사용되어 문자열을 검색하거나 변환할 수 있습니다.
-
test()
: 문자열이 정규표현식과 일치하는지 검사하고 결과를 true
또는 false
로 반환합니다.
let pattern = /\d{2,3}-\d{3,4}-\d{4}/;
pattern.test('010-1234-5678'); // true
pattern.test('01012345678'); // false
-
exec()
: 문자열에서 정규표현식과 일치하는 문자열을 검색하고, 일치하는 문자열을 배열로 반환합니다.
let pattern = /[A-Z]/;
pattern.exec('Hello Weniv'); // 'H'
-
match()
: 문자열에서 정규표현식과 일치하는 문자열을 검색하고, 일치하는 문자열을 배열로 반환합니다.
let pattern = /[A-Z]/g;
'Hello Weniv'.match(pattern); // ['H', 'W']
-
replace()
: 문자열에서 정규표현식과 일치하는 문자열을 찾아 다른 문자열로 대체합니다.
let pattern = /[A-Z]/g;
'Hello Weniv'.replace(pattern, '👋'); // '👋ello 👋eniv'
-
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