본문 바로가기
Javascript

정규식, 정규표현식, Regular Expression, RegExp 완전 기초 정리

by 즐코딩 2023. 1. 23.
반응형

정규식, 정규표현식, Regular Expression, RegExp 완전 기초 정리



정규표현식 또는 정규식으로 불리는 내용을 살짝 정리해보고 넘어가려고 합니다. 가뜩이나 프로그래밍 코드들도 외계어 같아 보일 수도 있는데, 정규표현식은 더더욱 외계인 기호처럼 보일 수도 있겠습니다.

정규표현식은 C, Java, Python, Javascript 등의 프로그래밍 언어와는 다른 것이라고도 볼 수 있습니다. 주로 <문자열 패턴>을 검사하는 경우에 사용하는 예를 자주 만날 수 있습니다. 웹 문서에서는 입력받은 '이메일 주소'가 유효한 패턴인지, 혹은 입력받은 '패스워드'가 최소한 8자 이상이며 특수문자를 최소 1개 이상 포함하고 있는 지 등을 검증해낼 때 필수적으로 사용됩니다.

따라서, 정규표현식은 어떤 프로그래밍 언어를 다루던 간에, 부가적으로 알아두어야 할 또 다른 세계의 외래어 같은 것으로 이해해할 수 있겠습니다. 우리는 한국어를 사용하지만, 숫자는 아라비아 숫자를 사용하는 것 처럼 말이죠.


Javascript에서 문자열을 검사하는 방법


자바스크립트에서는 다음과 같은 방법으로 문자열을 검사합니다.

'abcd'.includes('a'); // abcd라는 문자열에 'a'를 포함하고 있는지 여부를 검사

//결과는 true

javascript에서-문자열에-포함된-글자를-확인하는-방법
javascript에서 문자열에 포함된 글자를 확인하는 방법


그런데 이와 같은 방법으로는 매우 복잡한 문자열의 조합 '패턴'들을 찾는 데에는 한계가 존재합니다. 왜냐하면, 저 문자열에 '한글이 들어 있는지?', '숫자가 들어 있는지?'하는 것은 검사할 수가 없기 때문입니다.

예를 들어, abcd 부분을 사용자가 "abcd@gmail.com"입력했다고 가정할 때에도, 이 문자열이 올바른 이메일 주소 형식인지 여부를 검증해 내기가 매우 어려워질 것입니다. 이 경우에는 사용자가 무얼 입력한게 중요한 게 아니라, 사용자가 입력한 문자열의 '패턴'을 확인하는 것이 중요해지기 때문입니다.

바로 이와 같은 경우 <정규표현식>이라는 것을 사용해야 하는 것입니다.


정규식(정규표현식, Regular Expression)이란?



정규식이란, 문자를 검사할 수 있는 식을 말합니다. 때문에 일정한 형식을 갖게 되는데, 슬래시 기호로 시작하고 끝 납니다.

/a/


간단하죠? a라는 문자 1개가 존재하는가? 여부를 묻는 질문이라 보시면 됩니다. Javascript의 test()함수와 함께 사용하면서 true/false 결과를 확인할 수 있게 됩니다.

/a/.test('abcd');  //true

정규식으로-문자열에-포함된-글자를-확인하는-방법
정규식으로 문자열에 포함된 글자를 확인하는 방법



즉, 위 2가지 예제는 동일하게 true를 리턴해줍니다.

'abcd'.includes('a');  //true

/a/.test('abcd'); //true

두-개-함수의-결과-리턴값은-동일합니다.-하지만-사용목이-달라요!
두 개 함수의 결과 리턴값은 동일합니다. 하지만 사용목적이 달라요!



[ ]는 범위를 의미한다

 

/[a-z]/는 a부터 z까지 범위의 아무 문자 하나를 의미합니다. 즉, 영어 소문자 1개가 존재하는 지 여부를 검증하는 정규식입니다.
/[a-z]/.test('apple') // true

/[a-z]/.test('사과')  // false


그렇다면, 영어 대문자 1개는 어떻게 표현(expression)할까요?
영어 소문자의 범위를 참고해보자면 [A-Z]로 표현할 수 있겠습니다. 간단하죠?

그렇다면, 대소문자 구분없이 글자(캐릭터) 1개는 어떻게 표현할까요? 바로, [a-zA-Z]로 표현할 수 있습니다.
[a-zA-Z]는 a-z까지 그리고 A-Z까지 범위의 아무 문자 하나. 즉, 영어 알파벳 아무거나 1개를 의미합니다.

/[a-zA-Z]/.test('apple') // true

/[a-zA-Z]/.test('APPLE') // true

/[a-zA-Z]/.test('사과') // false


그러면, 한국어를 사용하는 우리 입장에서 한글 1개 문자는 어떻게 표현할까요?
즉, 문자열 중에 한글이 있는 지 없는 지는 어떻게 테스트 하면 좋을까요?


[ㄱ-ㅎ]는 ㄱ부터 ㅎ까지 범위의 아무 문자(자음) 하나를 의미합니다.

/[ㄱ-ㅎ]/.test('가나다라') // false

/[ㄱ-ㅎ]/.test('ㄱㄴㄷㄹ') //true


자음 단위로의 검사가 아니라, 한글 음절단위로 1개의 문자를 의미하려면 다음과 같이 표현식을 작성합니다.

/[ㄱ-ㅎ가-힣]/.test('Hello, Mr. Kim') //false

/[ㄱ-ㅎ가-힣]/.test('Hello, 미스터 김') //true


이와 같은 경우, 'ㅋㅋㅋ'나 'ㅎㅎㅎ' 등의 자음도 검사를 할 수 있게 되는 것이죠.

/[ㄱ-ㅎ]/.test('ㅋㅋㅋ') //true

/[ㄱ-ㅎ]/.test('ㅏㅏㅏ') //false


다만 모음만으로 이루어진 글자는 검사할 수 없습니다. 홑 모음까지도 검사를 하려면 다음과 같이 한글의 범위를 표현해주면 됩니다.

/[ㄱ-ㅎ가-힣ㅏ-ㅣ]/.test('ㅎㅎㅎ') //true

/[ㄱ-ㅎ가-힣ㅏ-ㅣ]/.test('ㅏㅏㅏ') //true


그렇다면, 한국어든 영어 대소문자든 혹은 숫자나 특수문자든 상관없이 아무 문자 1개는 어떻게 검사해낼 수 있을까요?


\S는 아무 문자 1개를 의미한다



역슬래시'\' 다음에 S(대문자)를 사용하면, 특수문자도 모두 포함하여 1개의 문자를 의미합니다.

/\S/.test('abcdefg');         //true
/\S/.test('123456');          //true
/\S/.test('가나다라마바사');   //true

 

^a는 a로 시작하는 지 여부를 검사한다


정규표현식이 문자열의 '패턴'을 검사하기 위한 목적이다 보니, 특정한 문자로 시작하거나 끝나는 경우를 검사할 필요에 대해서 대응을 하는 표현식이 존재합니다.

/^a/.test('apple')  //true
/^a/.test('banana') //false

 

a$는 a로 끝나는 지 여부를 검사한다


특정한 문자로 시작하는 경우에 대한 검사가 존재한다면, 특정한 문자로 끝나는 지 여부를 검사하는 표현식도 당연히 존재하겠죠? 문자 위에 $(달러) 표시를 해주면 됩니다.

/a$/.test('apple')  //false
/a$/.test('banana') //true

 

( ) 괄호의 사용으로 검사 조건을 묶을 수 있다


만일 a로 시작하고, a로 끝나는지 여부를 검사하려면 어떻게 표현식을 작성하면 좋을까요? and 조건으로도 생각해볼 수 있겠지만, 각 조건을 괄호로 묶어서 검사를 하는 방식을 먼저 살펴둡니다.

/(^a)*(a$)/.test('africa')    //true
/(^a)*(a$)/.test('apple')    //false


검사대상인 'africa'라는 문자열이, a로 시작하고 a로 끝나는 지 여부를 (괄호)를 사용하여 검사하면 됩니다.


|는 or의 의미로서 문자열을 검사한다



문자열 내에 a 또는 b가 존재하는 여부, 즉 들어 있느냐 아니냐를 검사하는 or의 의미로 검사를 해보자면, 다음과 같습니다.

/a|b/.test('banana'); //true
/a|b/.test('apple');  //true


일반적은 프로그래밍에서의 or를 의미하는 파이프라인(|)과 닮아있습니다.

*는 글자의 반복을 의미한다


문자열에 a도 존재하고 b도 존재하는가?를 검사하려면, 다음과 같은 방식으로도 가능합니다.

/a*b/.test('banana');   //true
/a*b/.test('apple');    //false


그러나, 이는 and의 의미는 아니고 a라는 글자가 n번이상 반복(multifly)된다는 의미를 가집니다.
즉, /a*b/는 a가 여러번 반복되고, b가 존재하느냐?라는 표현식이됩니다.



마치며



이번 포스트에서는 정규식 또는 정규표현식이라고 불리는 Regular Expression에 대해서 기초적인 내용을 살펴보았습니다. 정규식은 낯선 모습 때문에 어렵게 느껴지기만 할 수 도 있겠지만, 조금 학습을 해두면 프로그래밍 뿐만 아니라, 컴퓨터 활용 전반의 분야에서 매우 강력한 매크로 기능을 만드는 데도 유용하게 활용될 수 있습니다.

코딩 초보 시절에는 정규식의 표현식들을 전부 외워둘 필요는 크게 없고, 정규식을 사용하는 목적과 활용법 등에 대해 이해를 해둔 후 추후 실제 개발시 구글링 등으로 참고하여 개발을 진행하면 충분할 것 같습니다. 이후 심화 학습은 각자의 목적에 따라 각자의 몫이 되는 것이겠죠?^^

참고로 정규식에 대한 추가적인 공부는 https://regexr.com/ 요런 사이트들을 활용해서 심화할 수 있겠습니다.


즐거운 코딩생활, 즐코딩
KINcoding

반응형

댓글