[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"와 매칭되지만, 그룹으로 따로 저장하지 않음.
- 캡처 그룹 (Capturing Group):
- \ (역슬래시)
- 이스케이프 문자:
- 메타문자를 일반 문자로 취급하거나, 특별한 문자 클래스를 지정할 때 사용.
- 예: \.는 실제 점(.) 문자와 매칭.
- 특수 시퀀스:
- \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 → “$” 가 앞에 없는 숫자들 | 부정 조건 검사 |
반응형
'명령어' 카테고리의 다른 글
[vim/gvim] 명령어 정리 -2 | 검색, 한 번에 주석 처리, 한 번에 주석 삭제, 페이지 업 다운, 숫자 증가 감소, 창 분할 (split) (0) | 2024.05.16 |
---|---|
[vim/gvim] 명령어 정리 -1 | 커서이동, 편집, 문자 선택, 치환, 복사, 삭제 (0) | 2024.05.16 |