얕고넓은지식/linux

정규 표현식 (Regular Expression) 과 응용 사례를 정리해 보자

쪽마 2021. 11. 1. 17:08

https://hhui.tistory.com/8

 

문자+숫자[+특수문자] 정규식

$regex = '/^(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^*()\-_=+\\\|\[\]{};:\'",.<>\/?])*.{8,}$/i'; echo preg_match($regex, $str) ? 'ok' : 'fail'; 문자+숫자(+특수문자) 조합 8자리 이상의 문자열을 체크하는 정규..

hhui.tistory.com

 

1. 정규 표현식

 

아래는 자주 사용되는 정규식을 정리해 놓은 표입니다.

 

 ( )   패턴들을 하나의 그룹으로 묶음
  예>  or연산자인 | 과 함께 써서, (txt|hwp|doc) 과 같이 txt, hwp,doc 세가지에 매치시킬 수 있음
 +  기호 앞의 패턴이 1번 이상 발생하는 패턴
 예> ^\S+ (공백없는 텍스트로 시작하고, 한글자이상의 길이로 됨)
 ?   기호 앞의 패턴이 없거나 1번 발생하는 패턴 
  (0~1번 발생)
 예> \d+ (숫자가 없가나 1번 발생하는 패턴)
 *   기호 앞의 패턴이 없거나 1번 이상발생하는 패턴  
  (0 ~ 1번 이상 발생, ?과 *를 구분해야 함)
 .   모든 문자를 가르킴(\과 개행은 제외)
 ^   문자열(패턴)이나 행의 처음을 의미 
 $   문자열(패턴)이나 행의 종료를 알립니다.
 [ ]   [ ]사이에 들어간 문자중 하나를 매치
  예>  [abc] 는 ab, ac, ac를 모두 포함
 [^ ]    [ ] 의 부정을 의미.
  예> [^0-9] 라면, 0에서 9를 포함하지 않은 문자를 의미
 [A-Z]   A에서 Z까지의 대문자 중 하나를 찾습니다. 
  [0-9]는 0부터 9까지를 의미
  \s   공백문자
  \S   공백을 제외한 나머지 문자들
  (공백이 없는 텍스트 일때 사용하게됩니다)
  \w   "_"를 포함한, 영어와 숫자들
  \W   "_"를 제외한, 영어와 숫자가 아닌 문자열들과 일치. 
  \d   숫자를 일치 시킨다. [0-9]와 동일
  \D   숫자가 아닌 모든 문자
  {M,N}   최소 M번 이상, 최대 N번 이하로 발생하는 패턴
  참고로, {}는 정확하게 몇번 발생하는지를 말합니다.
  예>  \d{6} \- [1-4]\d{6} (주민등록 번호의 경우6자리숫자와 대쉬(-), 그리고 1에서4부터 숫자 + 6자리 숫자로 구성됩니다)
 |   or연산을 의미 (txt|doc) 는 txt또는 doc를 의미한다.
 (?i)   대소문자를 구분하지 않음

 

추가적으로 자주 사용하게 되는, 모든 숫자, 영문자는 아래와 같이 표현할 수 있습니다.

  • [a-zA-Z] : 모든 영문자,a-z는 소문자를 의미하구요, A-Z는 대문자를 의미합니다.
  • [0-9] : 0-9까지의 모든 숫자
  • [a-zA-Z0-9] : 대문자 및 소문자의 영문자와 숫자

 

2. 정규표현식 응용 사례

 

2-1. 숫자만 나오도록 할 때

 

텍스트는 제거하고 숫자만 나오도록 하고자 할 때가 있는데요.

replaceAll이라는 메소드와 정규 표현식을 사용할 수 있습니다.

>>  string.replaceAll("[^0-9]","");

 

[^0-9]는 숫자가 아닌 것을 의미하여서, 숫자가 아닌 모든 것을 ""으로 대체하라는 것인데요.

""은 결국 제거하는 것이 됩니다.

참고로 Kotlin에서는 replaceAll()함수가 없는데요. 대신 첫번째 인자에 .toRegex()함수를 체이닝해서 넣어주면 됩니다.

 

 

 

 

아래와 같이 숫자만 나오도록 하여습니다.

 

 

 

2-2. 이메일 형식 체크

 

@와 .com 들어간 이메일 주소를 확인할 때 사용합니다.

>> regex = "[0-9a-zA-Z][_0-9a-zA-Z-]*@[_0-9a-zA-Z-]+(\\.[_0-9a-zA-Z-]+){1,2}$";

  • @(at마크)다음에 .com같이 .(점) 이 들어가야 하는데요.

.(점)은 정규 표현식에서 모든 문자를 가르켜서, escape를 해주어야 합니다.

""안에 넣었기 때문에 \\으로 escape합니다.

 

실제로 helloWorld@tistory.com이라는 이메일과 helloNot이라는 텍스트를 가지고,

match()메소드를 이용해서 테스트를 해보겠습니다.

 

 

 

아래와 같이 첫번째 텍스트만 true값을 반환해 준 것을 볼 수 있습니다.

 

 

 

2-3. 파일 확장자 확인

 

>>  regex = "^\\S+.(?i)(txt|pdf|hwp|xls)$";

 

 

 

true를 반환하는 것을 확인할 수 있습니다.

 

 

 

이 밖에도 예를 들수 있는 것이 많을 것 같은데요.

계속 업데이트 하도록 하겠습니다.

 

 

3. 참고 사이트

 

정규 표현식에 어느정도 익숙해 지면,

실제로 정규표현식들을 만들어보고 테스트 해봐야 할텐데요.

 

아래 사이트에서 실제로 표현식을 만들고 테스트 해볼수 있습니다.

>>> RegExr 사이트 <<<

 

 

 

 

반응형