[Linux] 정규표현식 총 정리 | Regular Expression, 메타문자, 문자 그룹핑, 문자열 패턴

2025. 2. 16. 03:30명령어

반응형

이전 글

2024.04.07 - [명령어] - [Linux] 자주사용하는 cat, grep 명령어 | 옵션 정리

 

[Linux] 자주사용하는 cat, grep 명령어 | 옵션 정리

cat (catenate) : 사슬로 잇다, 연결하다; 암기하다 간단하게 파일을 출력하거나 바로 추가 및 작성할 수 있는 명령어 cat 사용법 cat 파일명 // 기존에 해당 파일일 있으면 터미널 창에 파일 내용을 바

wolleyneerg.tistory.com


1. 정규 표현식의 기본 개념

  • 목적: 문자열 내에서 특정 패턴(예: 이메일 주소, 전화번호, 특정 단어 등)을 검색하거나, 해당 패턴을 기준으로 문자열을 분리, 치환, 추출할 때 사용합니다.
  • 표현 방식: 일반 텍스트와 메타문자(특수문자)를 조합하여 패턴을 표현합니다.

 

2. 주요 구성 요소 및 메타문자

2.1 리터럴(Literal)

  • 의미: 그냥 문자 그대로를 의미.
  • 예: abc는 문자열 "abc"와 매칭.

 

2.2 메타문자(Metacharacters)

  • . (닷)
    • 의미: 줄바꿈(\\n)을 제외한 모든 단일 문자와 매칭.
    • 예: a.c는 "abc", "a1c", "a c" 등을 매칭.
  • ^ (캐럿)
    • 의미: 문자열의 시작.
    • 예: ^Hello는 "Hello"로 시작하는 문자열과 매칭.
  • $ (달러)
    • 의미: 문자열의 끝.
    • 예: world$는 "world"로 끝나는 문자열과 매칭.
  • *, +, ?, {m,n} (반복 Quantifiers)
    • *: 0회 이상 반복 (예: ab*c는 "ac", "abc", "abbc" 등을 매칭)
    • +: 1회 이상 반복 (예: ab+c는 "abc", "abbc" 등, "ac"는 불매칭)
    • ?: 0회 또는 1회 반복 (예: ab?c는 "ac"와 "abc" 매칭)
    • {m,n}: 최소 m회, 최대 n회 반복 (예: a{2,4}는 "aa", "aaa", "aaaa" 매칭)
  • [] (문자 클래스)
    • 의미: 대괄호 안에 있는 문자들 중 한 문자와 매칭.
    • 예: [abc]는 "a", "b", "c" 중 하나와 매칭.
    • 범위 지정: [a-z]는 소문자 알파벳 전체와 매칭.
    • 부정: [^abc]는 "a", "b", "c"를 제외한 모든 문자와 매칭.
  • | (파이프)
    • 의미: OR 조건.
    • 예: cat|dog는 "cat" 또는 "dog"와 매칭.
  • () (소괄호)
    • 캡처 그룹 (Capturing Group):
      • 괄호 안에 있는 부분을 하나의 그룹으로 묶어서 매칭한 내용을 저장.
      • 예: (abc)는 "abc"와 매칭되며, 매칭된 결과를 그룹으로 참조 가능.
    • 비캡처 그룹 (Non-Capturing Group):
      • (?: ... )와 같이 사용하며, 그룹화는 하지만 캡처(저장)는 하지 않음.
      • 예: (?:abc)는 "abc"와 매칭되지만, 그룹으로 따로 저장하지 않음.
  • \ (역슬래시)
    • 이스케이프 문자:
      • 메타문자를 일반 문자로 취급하거나, 특별한 문자 클래스를 지정할 때 사용.
      • 예: \.는 실제 점(.) 문자와 매칭.
    • 특수 시퀀스:
      • \d : 숫자와 매칭 (0-9)
      • \w : 단어 문자 (알파벳, 숫자, 밑줄)
      • \s : 공백 문자 (스페이스, 탭, 줄바꿈 등)
      • 대문자 버전(\D, \W, \S)는 각각 반대 개념을 의미합니다.
  •  

 

4. 부정 패턴

  • 부정 문자 클래스: [^...]
    • [^0-9]는 숫자가 아닌 문자에 일치
  • 부정 전방 탐색: (?!...)
    • \b(?!abc)\w+\b 는 "abc" 로 시작하지 않는 단어를 찾음.

 

5. 추가 개념

5.1 캡처 그룹과 역참조 (Backreference)

  • 캡처 그룹:
    • 괄호 ()를 사용하여 특정 부분을 캡처합니다.
    • 예: 정규식 (\\d{3})-(\\d{4})는 전화번호 형식 "123-4567"에서 앞 3자리와 뒤 4자리를 각각 캡처합니다.
  • 역참조:
    • 캡처한 그룹을 나중에 다시 참조할 수 있습니다.
    • 예: 정규식 (\\w+)\\s+\\1은 같은 단어가 연속으로 나타나는 경우("hello hello")를 매칭합니다.

괄호로 둘러싼 단위는 그룹을 나타내고, 그룹은 전체 패턴 내에서 다시 하나로 묶여지는 패턴 조각을 나타낸다

예시 결과
(tom|pot) tomato, potato
(a|i)(3)(bc) aaabc, iiibc, aiabc, iiabc …
  • 참조: 매칭된 그룹을 재사용할 수 있음.
    • (\d{3})-\1 은 3자리 숫자가 반복되는 패턴을 찾음. (예: "123-123")

 

5.2 탐욕적(Greedy) vs. 비탐욕적(Lazy) 매칭

  • 탐욕적 매칭:
    • 기본적으로 정규식은 가능한 한 많이 매칭하려고 합니다.
    • 예: a.*b는 "a"부터 마지막 "b"까지 모두 매칭할 수 있음.
  • 비탐욕적 매칭:
    • ?를 추가하여 최소한으로 매칭하도록 지정할 수 있습니다.
    • 예: a.*?b는 "a"부터 첫 번째 "b"까지 매칭합니다.

 

5.3 전방탐색(lookahead)과 후방탐색(lookbehind)

  • 전방탐색 (Positive Lookahead):
    • (?=...) 형식으로 사용하며, 특정 패턴이 뒤따르는지 확인하지만 그 부분은 매칭 결과에 포함하지 않습니다.
    • 예: \\w+(?=\\d)는 뒤에 숫자가 오는 단어를 매칭하지만 숫자는 포함하지 않습니다.
  • 후방탐색 (Positive Lookbehind):
    • (?<=...) 형식으로 사용하며, 특정 패턴이 앞에 있는지 확인합니다.
    • 예: (?<=\\$)\\d+는 "$" 기호 뒤에 나오는 숫자를 매칭합니다.
  • 부정 전방/후방 탐색:
    • 각각 (?!...)와 (?<!...)를 사용하여 특정 패턴이 뒤따르거나 앞에 오지 않는 경우를 매칭합니다.

 


메타문자/기호 설명 예시 용도
. 줄바꿈(\n)을 제외한 임의의 한 문자와 매칭 a.c → “abc”, “a1c”, “ac” 단일 문자 매칭
^ 문자열의 시작을 의미 ^Hello → “Hello World” 문자열 시작 확인
$ 문자열의 끝을 의미 world$ → “Hello world” 문자열 끝 확인
* 0회 이상 반복 ab*c → “ac”, “abc”, “abbbbc” 반복 횟수 지정없이 매칭
+ 1회 이상 반복 ab+c → “abc”, “abbc” 최소 1회 이상 매칭
? 0 또는 1회 반복 ab?c → “ac”, “abc” 
a.*?b → “a”부터 첫 번째 “b”까지 매칭
선택적 매칭
또는 비탐욕적 매칭
{m} 정확히 m회 반복 a{3} → “aaa” 반복 횟수 고정
{m, } 최소 m회 이상 반복 a{2, } → “aa”, “aaa”, “aaaa..” 하한선 지정
{m, n} 최소 m회, 최대 n회 반복 a{2,4} → “aa”, “aaa”, “aaaa” 반복 횟수 범위 지정
[…] 대괄호 안의 문자들 중 한 문자와 매칭 [abc] → “a”, “b”, “c”
[a-z] → 모든 소문자
문자 집합 지정
[^…] 대괄호 안의 문자를 제외한 한 문자와 매칭 (부정 패턴) [^abc] → “d”, “e”,…”z” 특정 문자들을 제외한 매칭
() 캡처 그룹: 괄호 내 패턴을 그룹으로 묶어 캡처하여 참조 가능 (abc) → “abc” 매칭 후 그룹으로 참조 가능 그룹화 및 역참조 가능
(?:…) 비캡처 그룹 : 그룹핑은 하되 캡처는 안함 (?:abc) → “abc” 그룹핑은 하되 캡쳐가 필요없는 경우
\ 이스케이프 문자: 메타문자를 일반 문자로 취급 \. → “.”
\\ → “\”
메타문자 이스케이프
\d 하나의 숫자와 매칭 \d → “5”, “3”, … 숫자 매칭
\D 숫자 외 문자와 매칭 \D → “v”, “@” 숫자 반대 개념
\w 단어 문자 (알파벳, 숫자, 밑줄) 매칭 \w → “t”, “3”, “_” 단어 구성 문자
\W 단어 문자 외 문자 매칭 \W → “!”, “ ” 단어 문자 반대 개념
\s 공백 문자 (스페이스, 탭, 줄바꿈 등) 매칭 \s → “ “. “\t”, “\n” 공백 문자 매칭
\S 공백 문자 외 문자 매칭 \S → “a”, “1”, “#” 공백 문자 반대 개념
(?=…) 전방 탐색 : 뒤따르는 패턴이 있는지 확인 \w+(?=\d) → 숫자 바로 앞 단어 조건 검사
(?!…) 부정 전방 탐색 : 뒤따르는 패턴이 없는 경우만 매칭 \w+(?!\d) → 숫자가 뒤따르지 않는 단어 부정 조건 검사
(?<=…) 후방 탐색 : 앞에 특정 패턴이 있는지 확인 (?<=\$)\d+ → “$” 뒤의 숫자들 조건 검사
(?<!…) 부정 후방 탐색 : 앞에 특정 패턴이 없는 경우에만 매칭 (?<!\$)\d → “$” 가 앞에 없는 숫자들 부정 조건 검사

 


 

반응형