정규식 정리

Regular Expression 정규표현식

정규식이라고도 부른다. 보통 regex, regexp라 많이 쓴다.

왜 정규표현식?

프로그래밍에서 사용하는 일종의 형식 언어 주로 문자열 관련 프로그래밍에 많이 사용된다. 특히 컴파일러의 파서 부분은 정규표현식이 반드시 들어간다. 개발하다보면 특성상 일정한 규칙을 가진 텍스트 문자열을 사용하는 경우가 많은데, 이럴 때 정규식을 사용한다. 유닉스 계열의 운영체제에서 cli환경을 주로 사용하는 경우, grep,sed,awk 등으로 인해 필수적으로 알게될 수 밖에 없다. 그렇다고한다. 특히 웹 프로그래밍에서는 문자열을 다루는 빈도가 특히 높아서 사용하는게 거의 필수적이다. 딱 보았을떄 일단 읽기에 난해하고 문법이 일반적인 형식과 다르며 중간에 강제개행이 허용되지 않아 한줄에 주르르륵 쓰기에 외계어 같은 느낌을 준다.

정규식의 문법

일단 문자열에서 url을 찾는 정규식의 예제를 보자.

;/(http|https|ftp|telnet|news|mms):\/\/[^\"'\s()]+/i

위의 정규식을 구분하면 다음과 같다.

  • / : 패턴구분자
  • (http|https|ftp|telnet|news|mms)://\"'\s()+ : 찾을 문자열의 패턴
  • / : 패턴구분자 끝
  • i : 패턴변경자

패턴구분자

정규식의 패턴이 달라질 경우 그것을 구분하는 문자열이다. 패턴이 하나만 있을경우에는 굳이 사용할 필요가 없지만 대부분 붙인다. 패턴구분자는 역슬래쉬를 제외하고 아무거나 쓸 수 있기에 난해해 질 수 있다.

메타문자

정규식에서 일정한 의미를 가지고 쓰는 특수문자를 메타문자라고 한다. 여기에 쓰이는 글자가 포함된 패턴을 넣으려면 글자 앞에 \를 넣어줘야 한다.

  • ^ : 문자열의 시작
  • $ : 문자열의 종료 옵션에 따라 문장의 끝 또는 문서의 끝에 매치됨
  • . : 임의의 한 문자
  • [] : 문자 클래스 문자 클래스 안에 들어가 있는 문자는 그 바깥에서 하나의 문자로 취급된다.
  • ^ : 문자 클래스 내에서 쓰는 ^는 not
    • : 예를들어 a-z는 a에서 z까지의 문자
  • | : or을 나타낸다.
  • ? : 앞 문자가 없거나 하나 있음
    • : *은 앞 문자가 0 개 이상
  • {n,m} : 앞 문자가 n개 이상 m개 이하, {0,1} 은 ? 과 같은의미
  • {n,} : 앞 문자가 n개 이상, 위의 형태에서 m이 생략된 형태이며 {0,}은 *와 같고 {1,}은 +와 같은의미
  • {n} : 앞 문자가 정확히 n개, {n,n}과 같은 의미
  • () : 하나의 패턴구분자 안에 서브 패턴을 지정해서 사용할 경우 괄호로 묶어주는 방식을 사용
  • \s : 공백문자
  • \b : 문자와 공백 사이를 의미
  • \d : 숫자[0-9]와 같다.
  • \t : 탭문자
  • \w : 단어 영문자+숫자+(밑줄)[0-9a-zA-Z] 문자 이스케이프는 대문자로 적으면 반대를 의미?

패턴 변경자

패턴 구분자가 끝나면 그 뒤에 쓰이는 것으로, 패턴에 일괄적으로 변경을 줄 때 사용한다. 정규식 엔진에 따라 변경자의 적용 방식이 상이하므로 해당 구현의 메뉴얼을 잘 확인해야한다. 자바스크립트는 /패턴/i로 쓰나 파이썬에서는 또다르다.

  • i : 패턴을 대소문자 구분 없이 검사한다. 이 변경자를 사용하는 경우 [a-z]만 해도 자동으로 [a-zA-Z]와 같은 기능을 하게된다. 영어가 아닌 언어를 다룰때에는 버그 가능성이 높으므로 권장되지 않는다. 한글, 한자 가나문자는 대소문자 개념이 없으므로 이 변경자가 아무 역할도 하지 않는다.
  • s : 임의의 한 문자를 가리키는 . 메타 문자에 개행 문자 (\n)도 포함시키도록 한다. 이 변경자를 사용하먄 . 이 줄바꿈도 임의의 한 문자로 취급하여 찾는다.
  • g: ^문자가 문장이 아닌 문서의 처음에, $ 문자가 문장의 끝이 아닌 주어진 문자열의 끝에 매치되게 변경한다.
  • m: 주어진 문자열에 줄바꿈이 있을 경우, 여러 줄로 취급하여 검사함. 줄바꿈이 없다면 사용해도 의미가 없으며 원래 정규식에서 줄바꿈은 무시되는데, m을 사용하면 줄바꿈을 적용해서 검사한다. ^은 한 줄의 시작, $는 한 줄의 끝으로 의미가 달라진다.
  • x: 공백 문자를 무시함. 단 \ 이스케이프 와 같이 쓸경우 문자 클래스 안에 있을 경우에는 예외이다. 정규식을 조금 더 읽기 편하게 만들어줌.

기본적인 정규식 예제들

  • ^[0-9]*$ : 숫자
  • ^[a-zA-Z]$ : 영문자. 패턴변경자를 사용하여 /^[a-z]$/i 와 같이 사용 가능
  • ^[가-힣]*$ : 현대 한글 (유니코드를 지원하는 정규식 엔진에 한정)
  • ^[ㄱ-ㅣ가-힣]*$ : 한글 자모 낱자를 포함한 모든 현대 한글
  • ^[a-zA-Z0-9]*$ : 영문/숫자

참고하며 학습하기 좋은사이트!

https://regexone.com/ 단계적으로 ㅂ학습 가능 https://regex101.com/ 간편하게 정규식을 연습하고 디버깅이 가능한 사이트


Written by@jaeyoung-son
배운것을 기록하는 공간입니다.

GitHub