IT 정보 로그캣/CS

정규 표현식

지푸라기 개발자 2020. 2. 3. 02:00
반응형

 코딩을 하다보면 정규표현식이 필요할 때가 많다.

표현하고 싶은 문자열의 패턴을 간단한 표현으로 나타낼 수 있기 때문이다.

정규 표현식을 사용하지 않으면 코드가 엄청 길어지거나 표현하기 까다로운 경우가 많다.

예를들어 이메일이나 비밀번호는 특정한 입력 조건이 필요하다.

이 때 특수 문자가 반드시 들어가야 한다든지 특정 특수 문자는 입력이 불가능 하다든지와 같이 유효성 검사를 할 때 정규 표현식이 요긴하게 사용된다.

또한 텍스트에서 특정 정보나 패턴을 찾을 때 혹은 단어나 데이터 등을 변환할 때에도 정규 표현식을 사용할 수 있다.

간혹 정규 표현식을 사용하면 알고리즘 문제 등도 쉽게 해결되는 경우도 있다.

정규 표현식도 결국 개발자(정규표현식은 개발자 이외에도 자료를 다루는 사람 등도 해당된다.)의 생산성이나 유지보수에 있어서 좋기 때문에 사용한다고 보면 된다 :)

 

 

 

 

정규 표현식(Regular expression) 이란

 정규 표현식은 정규식, Regex 으로도 많이 부르는데 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.

한글로 표현하면 뜻이 더 어렵게 느껴지는데 영어 그대로 보자면 규칙적인 것, 일종의 패턴을 표현하는 언어라고 보면 된다.

정규 표현식은 대부분의 프로그래밍 언어나 텍스트 편집기(Intellj, visual studio code ...), OS(Unix/Linux, Mac, Windows) 에서 사용할 수 있다.

 

 

 

정규 표현식의 역사

 정규 표현식은 1956년 스티븐 클레이니가 정규 집합(regular set)이라는 자신의 수학적 개념을 이용하여 정규 언어를 기술한 것을 기원으로 보고 있다. 여러 형태의 정규 표현식이 유닉스 프로그램에 사용되었고, 이후에 정규 표현식이 POSIX에 표준으로 인정 되었다.

POSIX의 정규 표현식도 다시 Basic 과 Extended 로 나뉘어 진다.

 

POSIX(Portable Operating System Interface X, x는 유닉스 호환 운영체제에 보통 x가 붙는 것에서 유래) 란

POSIX는 이식 가능 운영체제 인터페이스라는 뜻으로 서로 다른 UNIX OS의 공통 API를 정리하여 이식성 높은 유닉스 응용 프로그램을 개발하기 위한 목적으로 IEEE가 책정한 애플리케이션 인터페이스 규격이다. 즉, UNIX OS 간에 호환이 가능하도록 기준을 마련한 것으로 이해하면 된다. 

 

1980년대에 POSIX의 정규 표현식을 확장한 Perl의 정규 표현식이 등장했으며, 이 또한 PCRE (Perl Compatible Regular Expressions)로 정리되며 많은 프로그래밍 언어에서 사용된다. 

정규 표현식은 하나의 갈래로 이어져 확장되는게 아니라 기본적인 체계는 비슷하면서도 사소하게 다른 형태로 나뉘어져 있다.

그래서 정규 표현식은 프로그래밍 언어마다 문법이 조금씩 다르다. 

하지만 또 그렇게 큰 차이는 없어서 언어 별로 정규 표현식을 사용하는데 어려움은 없지만 다량의 텍스트를 다룰 때는 실수를 할 수 있는 확률이 높아 주의할 필요가 있다. 때문에 자신이 사용하는 언어의 정규 표현식을 확인은 하고 사용하는게 좋다.

 

 

 

정규 표현식 문법

 

패턴 구분자

 정규 표현식의 패턴이 달라질 경우 패턴을 구분하는 문자인데 보통은 슬래쉬(/)로 정규 표현식을 감싸준다.

"보통은" 이라고 말한 이유는 꼭 슬래쉬(/)가 아니어도 되기 때문이다.

예를들어 아래 처럼 해쉬(#) 나 (%) 등 특수문자 중에 공백이 아닌 문자나 역슬래쉬(\)를 제외하고는 아무거나 사용이 가능하다. 

  • /^[0-9]*$/

  • #^[0-9]*s#

  • %^[0-9]*s%

 

 

 

메타 문자

 정규 표현식에서 일정한 의미를 가지고 사용되는 특수문자를 메타 문자라고 한다.

 

  • ^ : 문자열의 시작

  • $ : 문자열의 종료

  • . : 임의의 한 문자

  • | : or 을 의미

  • [] : 문자 클래스. 문자 클래스 안에서 ^ 는 not 을 의미하고 - 는 범위를 의미함

  • ? : ?의 앞 문자가 없거나 하나 있음

  • + : +의 앞 문자가 하나 이상 있음

  • * : *의 앞 문자가 0개 이상 있음

  • {n} : {n}의 앞 문자가 정확히 n개 있음

  • {n,} : {n}의 앞 문자가 n 번 이상 있음

  • {n,m} : 앞 문자가 n개 이상 m개 이하로 있음

  • () : 연산자의 범위와 우선권을 정의할 수 있음

  • \s : 공백 문자

  • \b : 문자와 공백 사이를 의미

  • \d : 숫자 [0-9]와 동일

  • \t : 탭문자

  • \w : 밑줄(_)을 포함한 영숫자 문자로 [A-Za-z0-9_]와 동일 

* 문자 이스케이프는 대문자로 적으면 반대를 의미한다.

 

 

 

패턴 변경자

 패턴 구분자가 끝나면 그 뒤에 쓰는 것으로, 패턴에 일괄적으로 변경을 가할 때 사용한다.

 

  • g: global을 의미하며 문자열 내의 모든 패턴을 찾음 (^ 를 문서의 처음에 $ 를 문서의 끝에 매치되게 변경)

  • i : ignore case를 의미하며 대소문자를 구별하지 않음

  • m : Multi line을 의미하며 문자열에 줄바꿈이 있더라도 패턴을 찾음

  • s : 문자열에 개행 문자(\n)도 포함하여 패턴을 찾음

  • x : 공백 문자를 무시함

 

 

 

자주 사용되는 정규 표현식

  • 숫자 : ^[0-9]*$

  • 영문자: ^[a-zA-Z]*$ 

  • 유니코드 한글: ^[가-힣]*$

 

  

 

 언급했듯이 프로그래밍 언어 마다 조금씩 지원하는 정규 표현식 문법이 다르기 때문에 이정도의 기본 정도만 익혀두고 자기가 사용하는 언어의 정규 표현식을 찾아 따로 확인을 해야한다.

어차피 대부분 정규 표현식을 자주 까먹기 때문에 보통은 정규 표현식을 작성할 때 마다 다시 확인하는 경우가 많다. (나만 그런가?)

하지만 정규 표현식을 잘 익혀두면 유용하게 사용하는 경우가 많아서 한 번쯤은 공부하고 정리하는게 필요한 부분이다.

 

 

 

 

 

반응형