▶ 정규 표현식(Regular Expression)이란?
정규표현식(Regular Expression)은 문자열을 처리할 때 유용한 도구입니다.
특정 패턴을 찾거나 대체하거나, 입력값의 유효성을 검사할 때 사용할 수 있습니다. 정규표현식의 기본 문법에 대해 알아보고 간단한 예제들을 통해 실제로 어떻게 적용하는지 이해해보겠습니다.
정규표현식의 정의는 문자열에서 특정한 패턴을 찾거나 대체하기 위한 문자열입니다. 이를 사용하면 복잡한 문자열 처리 작업을 간단하게 할 수 있습니다. 처음 코딩을 배울 때는 알고리즘 문제 풀이에서 특히 많이 사용하게 됩니다.
▶ 정규 표현식의 기본 문법 요소
▷기본 요소
. : 어떤 문자든 한 개와 일치합니다.
* : 앞의 문자가 0회 이상 반복됩니다.
+ : 앞의 문자가 1회 이상 반복됩니다.
? : 앞의 문자가 0회 또는 1회 나타납니다.
{m,n} : 앞의 문자가 최소 m회, 최대 n회 나타납니다.
[abc] : a, b, c 중 하나의 문자와 일치합니다.
[^abc] : a, b, c를 제외한 모든 문자와 일치합니다.
(ab|cd) : ab 또는 cd 패턴 중 하나와 일치합니다.
▷문법 요소
^ : 문자열의 시작을 의미합니다.
$ : 문자열의 끝을 의미합니다.
| : 여러 패턴 중 하나와 일치합니다 (OR 연산).
\ : 특수 문자를 문자 그대로 해석하도록 합니다.
\d : 숫자를 나타냅니다. [0-9]와 동일합니다.
\D : 숫자를 제외한 문자를 나타냅니다. [^0-9]와 동일합니다.
\w : 문자, 숫자, 밑줄 기호(_)를 나타냅니다. [a-zA-Z0-9_]와 동일합니다.
\W : 문자, 숫자, 밑줄 기호를 제외한 문자를 나타냅니다. [^a-zA-Z0-9_]와 동일합니다.
\s : 공백 문자를 나타냅니다. (공백, 탭, 줄바꿈 등)
\S : 공백 문자를 제외한 문자를 나타냅니다.
a-z : a부터 z까지의 모든 소문자를 의미 => 응용가능
(그룹) : 일치하는 문자열 중 일부분을 캡처합니다. 이후 참조 및 조작에 사용됩니다.
▶ 정규 표현식의 적용 예시
▷예시 1번 숫자만 필터링하기 / 문자만 필터링하기
// 숫자만 필터링 하기
const mixedString = "a1b2c3d4e5f6g7h8i9j0";
const numberPattern = /\d/g;
const onlyNumbers = mixedString.match(numberPattern).join('');
console.log(onlyNumbers); => 1234567890 출력
// 문자만 필터링 하기
const mixedString = "a1b2c3d4e5f6g7h8i9j0";
const stringPattern = /\D/g;
const onlystring = mixedString.match(stringPattern).join('');
console.log(onlystring); => abcdefghij 출력
위의 예시 코드를 사용하면 숫자만 문자가 섞여 있는 문자열에서 숫자 와 문자만 구분해서 필터링 할 수 있다.
이 방식으로 해결한 프로그래머스 예제를 한번 볼까요?
문제 설명(프로그래머스/Lv0/소인수분해)
문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수 를 작성해보세요.
function solution(my_string) {
return my_string.match(/\d/g).map(el => Number(el)).sort((a,b)=>a-b)
}
숫자만 필터링하기 예제를 이용하여 간단하게 해결했다.
▷예시 2번 이메일 주소 검사하기
const emails = ["john@example.com", "jane@domain", "bad.email@"];
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
const validEmails = emails.filter(email => emailPattern.test(email));
console.log(validEmails); => ['john@example.com'] 출력
▷예시 3번 전화번호 검사하기
const phoneNumbers = ["010-1234-5678", "011-123-4567", "012345678"];
const phoneNumberPattern = /^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$/;
const validPhoneNumbers = phoneNumbers.filter(number => phoneNumberPattern.test(number));
console.log(validPhoneNumbers); => ['010-1234-5678', '011-123-4567'] 출력
▷예시 4번 한글만 포함된 문자열 검사하기
const texts = ["안녕하세요", "Hello", "안녕! こんにちは"];
const hangulPattern = /^[가-힣]+$/;
const hangulTexts = texts.filter(text => hangulPattern.test(text));
console.log(hangulTexts); => ["안녕하세요"] 출력
▷예시 5번 날짜 형식 검사하기 (YYYY-MM-DD)
const dates = ["2023-04-01", "2021-13-01", "2021-02-29"];
const datePattern = /^(19|20)\d{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/;
const validDates = dates.filter(date => datePattern.test(date));
console.log(validDates); => ['2023-04-01', '2021-02-29'] 출력
▷예시 6번 특정 단어를 대체하기
const text = "I love apples! Apples are my favorite fruit.";
const replacePattern = /apples/gi;
const newText = text.replaceAll(replacePattern, "bananas");
console.log(newText); => I love bananas! bananas are my favorite fruit. 출력
▷예시 7번 URL 검증하기
const urls = [ "https://www.example.com", "http://www.example.com", "www.example.com",
"example.com", "https://example", "ftp://example.com" ];
const urlPattern = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;
const validateURL = (url) => urlPattern.test(url);
urls.forEach((url) => {
console.log(`${url} is ${validateURL(url) ? "valid" : "invalid"}`);
});
<출력 결과>
https://www.example.com is valid
http://www.example.com is valid
www.example.com is valid
example.com is valid
https://example is invalid
ftp://example.com is invalid
▷예시 8번 파일 확장자명 검사
const filenames = [ "example.png", "document.pdf", "image.jpeg",
"archive.zip", "audio.mp3", "video.mp4", "invalidfile.pn", "script.js" ];
const allowedExtensions = ["png", "pdf", "jpeg", "zip", "mp3", "mp4"];
const extensionPattern = new RegExp(`\\.(${allowedExtensions.join("|")})$`, "i");
const validateExtension = (filename) => extensionPattern.test(filename);
filenames.forEach((filename) => {
console.log(`${filename} is ${validateExtension(filename) ? "valid" : "invalid"}`);
});
<출력 결과>
example.png is valid
document.pdf is valid
image.jpeg is valid
archive.zip is valid
audio.mp3 is valid
video.mp4 is valid
invalidfile.pn is invalid
script.js is invalid
정규 표현식을 이용해 특정 확장자명만 통과 시키도록 코드를 구성했다. 만약 파일명 한가지만 통과 시키고 싶다면 아래와 같이 짜면 된다.
const htmlPattern = /\.(html|htm)$/i;
const isHtmlFile = (filename) => htmlPattern.test(filename);
filenames.forEach((filename) => {
console.log(`${filename} is ${isHtmlFile(filename) ? "an HTML file" : "not an HTML file"}`);
});
▶ 추가로 학습하는 방법
정규표현식을 공부하면서 느낀 점은 직접 계속 사용해봐야 익숙해 질 수 있다는 것 입니다. 실제 개발에서 활용하는 예제는 위와 같이 한정되어 있기 때문에 알고리즘 문제 등에 직접 적용해보면서 학습 해 가는 것이 좋은 방법 같습니다.
빠른 학습을 위해 몇 가지 자료를 공유드립니다.
정규표현식 맞춤범을 테스트 해 볼 수 있는 사이트입니다.
RegExr: Learn, Build, & Test RegEx
RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).
regexr.com
프로그래머스에서 운영하는 정규표현식 문제 코스 입니다.
=> https://school.programmers.co.kr/learn/courses/11/11-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D
'코딩 개념 정리' 카테고리의 다른 글
에라토스테네스의 체(Sieve of Eratosthenes) => 소수찾기 알고리즘 (0) | 2023.04.08 |
---|---|
시간복잡도/공간복잡도/빅오-표기법 (0) | 2023.04.03 |
3.실제 사이트의 UI/UX 분석해 보기 (2) | 2022.10.26 |
2.UI/UX (0) | 2022.10.24 |
1.재귀(Recursion)에 대하여 (0) | 2022.10.20 |