메뉴 닫기

정규 표현식(Regex) 이란?

 

정규 표현식
정규 표현식 예제

정규 표현식(Regex) 이란?

정규표현식(Regex)이란, 문자형 데이터를 다루는 기법중 하나이며 리눅스뿐만 아니라 다양한 언어에서도 활용되고 있습니다. 정규 표현식을 사용한다면 간단하게 원하는 결과를 얻을 수 있다는 장점이 있습니다. 그럼에도 다양한 문자를 결합해 사용하는만큼 가독성이 떨어지고 자칫하면 다른 사람이 보았을 때 이해하기 어려울 수 있다는 단점이 있습니다.
하지만 특정 상황에서는 여러 명령어 또는 함수를 사용하는것보다 정규 표현식이 간편한 경우도 있기에 공부 했었던 내용을 글로서 정리해 두려 합니다.

리눅스에서 정규 표현식과 관련된 유틸리티로는 grep, sed, awk 등이 있으며 해당 문서에서는 grep 명령어를 사용하여 정규 표현식을 설명하려 합니다.

  • grep : 유닉스에서 가장 기본적인 REGEX 평가 유틸리티. Global Regualr Expression Print의 약어
  • sed : stream editor로, REGEX 기능을 일부 탑재
  • awk: 패턴식 다루기 가능한 언어툴로, 프로그래밍 언어의 일종. 문자열 관련한 방대한 기능 가짐

정규 표현식에도 여러 종류가 있으며 대표적으로는 POSIX REGEX, PCRE 두 개가 있습니다.


정규 표현식의 종류

  1. POSIX REGEX
    • POSIX REGEX 란, 이식 가능 운영 체제 인터페이스 (Portable Operating System Interface) 의 약자로, 서로 다른 UNIX OS의 공통 API를 정리해 이식성이 높은 유닉스 응용 프로그램을 개발하기 위해 IEEE가 책정한 애플리케이션 인터페이스 규격입니다.
      간단한 패턴 매칭에 사용하며, 복잡한 패턴에서는 약간의 성능 저하가 발생할 수도 있습니다. 하지만 이 표현이 표준이므로 POSIX 표현식부터 배우는 것이 좋습니다.
      이는 다시 BRE(Basic RE)ERE(Extended RE) 로 기법이 나뉩니다. BRE는 grep 작동의 기본 값입니다. 아무 옵션을 적지 않으면 BRE를 기본으로 작동합니다. ERE는 기능적으로는 같으나 더 많은 표현식과 편의성을 제공하며, egrep의 기본값 입니다. 
    • 아래는 BRE와 ERE의 메타문자 종류 입니다. 급하신 분들은 아래 표만 참고하셔도 도움이 될 듯 합니다.
BRE 패턴 ERE 패턴 설명
. . 임의의 한 문자 a.b : aab, abb, acb, …
* * 선행 문자 패턴이 0개 이상 ab* : a, ab, abb, …
+ + 선행 문자 패턴이 1개 이상 ab+ : ab, abb, abbb, …
\? ? 선행 문자 패턴이 0~1 개 ab? : a, ab
{n,m}   선행 문자 패턴이 n~m개 a
^ ^ 해당 문자로 시작 또는 끝 a^ : a, ba, bba, …
$ $ 행의 시작 $a : a, aa, ab, abc, …
[…] […] [ ]안의 문자들 중 한 문자 [abc] : a, b, c
[^…] [^…] [ ]안의 문자들이 아닌 문자들 중 한 문자 [^abc] : d, e, f, …
\ \ 메타문자의 의미를 제거/생성 a.b : a.b
| | or a|b|c : a, b, c
(…) (…) 그룹 (ab)+ : ab, abab, ababab, …
       

정규표현식 요약본

  1. PCRE (Perl Compatible Regualr Expression)
    • Perl에서 제공되던 REGEX가 우수하여 다른 언어에서도 제공하기 위해 만들어졌습니다. C언어로 만들어져 있으며, POSIX REGEX에 추가된 확장 기능 가지고 성능이 더 좋습니다. C, C++, Python 등에서 추가 라이브러리의 형태로 대부분의 언어에서 지원됩니다.

 

grep 사용 방법


grep 명령어는 특정 문자열에서 원하는 문자열 또는 정규표현식을 포함한 행을 출력해주는 명렁어 입니다. ls, cat, sed, awk 등 다양한 명령어와 조합되어 사용되는 경우가 많고, 유용한 옵션이 많이 있어 고마운 명령어 입니다. grep 을 실행할 때는 matcher(matching 을 실행하는 엔진)을 고를 수 있습니다.

  • matcher
    matcher 설명
    -G 디폴트 값으로, BRE를 사용해 작동
    -E ERE를 사용해 작동. egrep 작동값과 동일
    -P PCRE 사용해 작동. pcre2grep 작동값과 동일
    -F 고정 길이 문자열 탐색 모드. 잘 안 씀
  • options 
-E : PATTERN을 확장 정규 표현식(Extended RegEx)으로 해석.
-F : PATTERN을 정규 표현식(RegEx)이 아닌 일반 문자열로 해석.
-G : PATTERN을 기본 정규 표현식(Basic RegEx)으로 해석.
-P : PATTERN을 Perl 정규 표현식(Perl RegEx)으로 해석.
-e : 매칭을 위한 PATTERN 전달.
-f : 파일에 기록된 내용을 PATTERN으로 사용.
-i : 대/소문자 무시.
-v : 매칭되는 PATTERN이 존재하지 않는 라인 선택.
-w : 단어(word) 단위로 매칭.
-x : 라인(line) 단위로 매칭.
-z : 라인을 newline(\n)이 아닌 NULL(\0)로 구분.
-m : 최대 검색 결과 갯수 제한.
-b : 패턴이 매치된 각 라인(-o 사용 시 문자열)의 바이트 옵셋 출력.
-n : 검색 결과 출력 라인 앞에 라인 번호 출력.
-H : 검색 결과 출력 라인 앞에 파일 이름 표시.
-h : 검색 결과 출력 시, 파일 이름 무시.
-o : 매치되는 문자열만 표시.
-q : 검색 결과 출력하지 않음.
-a : 바이너리 파일을 텍스트 파일처럼 처리.
-I : 바이너리 파일은 검사하지 않음.
-d : 디렉토리 처리 방식 지정. (read, recurse, skip)
-D : 장치 파일 처리 방식 지정. (read, skip)
-r : 하위 디렉토리 탐색.
-R : 심볼릭 링크를 따라가며 모든 하위 디렉토리 탐색.
-L : PATTERN이 존재하지 않는 파일 이름만 표시.
-l : 패턴이 존재하는 파일 이름만 표시.
  • 예제로 사용할 텍스트
    kimbh@kimbh:~$ cat sample 
    apple
    bat
    ball
    ant
    eat
    pant
    peaple
    taste
    @kimbh
    123_abc_d4e5
    xyz123_abc_d4e5
    123_abc_d4e5.xyz
    xyz123_abc_d4e5.xyz
    010-1231-1231
    01012311231
    xyz
    
    

표준 정규 표현식 (BRE, Basic Regx)


  • 리터럴 일치

    grep 명령어의 가장 기본적인 용도는 파일에서 리터럴 문자 또는 일련의 문자를 검색하는 것입니다. 예를 들어 /etc/passwd 파일에 “bash” 문자열이 포함된 모든 줄을 표시하려면
    ‘grep bash /etc/passwd’ 와 같이 사용 합니다.
    문자열 “bash”는 4개의 리터럴 문자로 구성된 기본 정규식입니다. 그러면 grep에서 “b”, “s” 및 “h” 바로 뒤에 “b”가 있는 문자열을 검색하도록 지시합니다.

    * 리터럴은 데이터(값) 그 자체를 뜻한다. 즉, 변수에 넣는 변하지 않는 데이터를 의미하는 것

  • ^(캐럿)

    ‘^’ 기호는 줄의 시작 부분에 있는 빈 문자열과 일치합니다. 다음 예제에서 문자  “a”가 줄의 맨 처음에 발생하는 경우에만 일치합니다.

    kimbh@kimbh:~$ grep '^a' sample
    apple
    ant
    ant
    antant
    annt
    
  • $ (달러)

    \$ 기호는 줄의 시작 부분에 있는 빈 문자열과 일치합니다. 문자  “t”로 끝나는 줄을 찾으려면 다음을 사용합니다.

    kimbh@kimbh:~$ grep t$ sample
    bat
    ant
    eat
    pant
    

    두 앵커를 모두 사용하여 정규식을 구성할 수도 있습니다. 예를 들어, “xyz”만 포함된 줄을 찾으려면 아래와같이 실행합니다.

    kimbh@kimbh:~$ grep '^xyz$' sample
    xyz
    

    또는 모든 빈 줄과 일치하는 값을 추출하는 ‘^$’ 으로도 사용할 수 있습니다.

  • ’.’(마침표)

    ‘.’ (마침표) 문자의 개수와 일치하는 문자열을 찾습니다. 예를 들어, “ap”으로 시작한 다음 두 개의 문자가 있고 “e” 문자열로 끝나는 항목을 찾으려면 다음 패턴을 사용합니다.

    kimbh@kimbh:~$ grep 'ap..e' sample
    apple
    
  • ?(물음표)

    선행문자를 선택사항으로 지정하며 한 번만 일치시킬 수 있습니다. 다음은 “밝음”과 “오른쪽” 모두 일치합니다. 다음과 같은 기본 정규식을 사용하므로 백슬래시를 사용하여 ? 문자를 이스케이프합니다.

    grep ‘b\?right’ file.txt

  • 대괄호 식 ‘[]’

    대괄호 표현식은 ‘[ ]’ 로 묶어서 문자 그룹을 일치시킬 수 있습니다. 예를 들어, “accept” 또는 “accent”가 포함된 행을 찾는 경우 다음과 같이 사용할 수 있습니다.

    grep 'acce[np]t' file.txt
    

    대괄호 안의 첫 번째 문자로 캐럿(^)을 적은 경우 대괄호 내의 있는 문자는 검색하지 않습니다. 아래와 같이 사용할 경우 “ba”로 시작하는 문자열의 조합은 “bat”, “ball”이 있지만 3번째 문자가 t가 아닌 문자만 검색하게 됨으로 “ball”만 출력 됩니다.

    kimbh@kimbh:~$ grep 'ba[^t]' sample
    ball
    

    문자를 하나씩 배치하는 대신 대괄호 안에 문자 범위를 지정할 수 있습니다. 범위 표현식은 하이픈으로 구분된 범위의 첫 번째 및 마지막 문자를 지정하여 구성됩니다. 예를 들어, [a-e]는 [abcde]와 같고 [1-3]은 [123]과 같습니다.

    아래 명령어는 [abcde]로 시작하는 줄을 검색합니다.

    kimbh@kimbh:~$ grep '^[a-e]' sample
    apple
    bat
    ball
    ant
    eat
    
  • Quantifier in regex (수량자)

    수량자를 사용하면 일치가 발생하기 위해 존재해야 하는 항목의 발생 횟수를 지정할 수 있습니다. 다음 표에서는 GNU grep 에서 지원되는 수량자 입니다.

    * 선행문자패턴이 0개 이상 반복
    {n} 선행문자패턴이 n번 일치
    {n,} 선행문자패턴이 n번 이상 일치
    {,m} 선행문자패턴이 최대 m번 일치
    {n,m} 선행문자패턴이 n번부터 m번까지 일치

확장 정규 표현식 (ERE, Extended Regex)

  • 확장 정규 표현식(ERE, Extended Regex)에는 표준 정규 표현식(BRE)에 없는 몇가지 메타 문자가 추가되었습니다.
    만일 grep 에서 사용하려면, -E 옵션을 통해 사용하면 됩니다.

    정규 표현식 의미
    . 임의의 한 문자
    ? 앞의 요소를 0 또는 1회
    + 앞의 요소를 1회 이상
    | 둘 중의 하나. 예를 들면, “abc|adc”는 “abc”와 “adc” 모두 포함

    아래는 확장 정규식을 활용하여, sample에 있는 문자열중 전화번호 형식으로 되어있는 모든 문자열을 출력하는 정규식입니다.

    [root@con01 local]# grep -E '[0-9]{3}-?[0-9]{4}-?[0-9]{4}' sample
    010-1231-1231
    01012311231
    

    만일 동일한 명령을 표준 정규식을 사용하여 출력한다면 아래와 같이 사용합니다.

    [root@con01 local]# grep '[0-9]\{3\}-\?[0-9]\{4\}-\?[0-9]\{4\}' sample
    010-1231-1231
    01012311231
    
  • Syntax classes (구문 클래스)
    grep은 대괄호로 묶인 구문 클래스도 지원합니다. 다음 표는 가장 일반적인 문자 클래스 중 일부입니다.

    구문 클래스 의미
    [:digit:] 숫자
    [:alpha:] 문자
    [:alnum:] 문자 또는 숫자
    [:upper:] 대문자
    [:space:] 공백 문자
    [:xdigit:] 16진수 숫자
    [:cntrl:] 제어 문자
    [:ascii:] ascii 문자

    확장 정규식 예 : 이메일

    [[:alnum:]_]+@[[:alnum:]-]+(\.[[:alnum:]-]+)*\.[[:alpha:]]{2,6}
    

마치며…

회사 스크립트를 보다가 모르는 정규식을 찾다보니.. 게시글로 정리까지 하게 되었네요 처음 작성하는 글이다 보니 장황하고 정리가 안되어 있는듯 하지만, 차차 스킬을 늘려서 더 많은내용 공유하겠습니다.

졍규 표현식의 종류는 설명한것 외에도 많이 있으며, 유용하게 사용 할 수 있는 옵션들도 다양하게 있는것 같습니다.

아래 참고 블로그와, GNU 홈페이지도 정말 정리가 잘 되어 있습니다. 관심 있으신분들은 한번씩 보셔도 좋을것 같습니다.


 Reference

– blog
https://rfriend.tistory.com/373
https://lascrea.tistory.com/100
https://winterbloooom.github.io/computer%20science/linux/2022/02/25/bash1.html
https://chartworld.tistory.com/27 https://unipro.tistory.com/174

– wiki
https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions

– GNU
https://www.gnu.org/software/grep/manual/html_node/index.html#SEC_Contents

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x