Linuxpia/Linux 명령어

[리눅스 명령어] 정규 표현식 한 걸음 더 들어가기

Linuxpia4U 2024. 9. 11. 15:43
반응형

정규 표현식 한 걸음 더 들어가기

정규 표현식(Regular Expression, regex)은 텍스트에서 특정 패턴을 찾거나, 텍스트를 변형하거나 검증하는 데 사용되는 강력한 도구입니다. 정규 표현식은 매우 유연하고 복잡한 패턴을 정의할 수 있는 특수한 문자 집합과 규칙으로 구성되어 있으며, 주로 문자열 검색, 텍스트 처리, 데이터 검증 등에 활용됩니다.

정규 표현식의 기본 개념

정규 표현식은 "일치(matching)"의 개념을 중심으로 작동합니다. 즉, 특정 패턴이 텍스트에서 일치하는지 여부를 확인하고, 그 결과에 따라 동작합니다. 이때 패턴은 일반 문자와 특수 문자의 조합으로 구성됩니다.

1. 문자와 메타문자

정규 표현식의 패턴은 크게 두 가지로 나눌 수 있습니다: 일반 문자와 메타문자(metacharacter).

  • 일반 문자는 정규 표현식에서 본래의 의미 그대로 사용됩니다. 예를 들어, 패턴 abc는 "abc"라는 정확한 문자열을 의미합니다.
  • 메타문자는 특수한 의미를 가지며, 패턴의 다양한 동작을 정의합니다. 예를 들어, .(마침표)는 임의의 한 문자를 의미합니다. 따라서 a.b라는 패턴은 "a", 임의의 문자 하나, "b"로 구성된 문자열과 일치합니다.

2. 패턴 매칭의 원리

정규 표현식은 주어진 문자열이 패턴과 일치하는지를 판단합니다. 패턴은 문자열의 특정 위치에서부터 차례로 검사 되며, 일치 여부가 결정됩니다. 이를 통해 문자열 내에서 부분적으로 패턴에 일치하는 텍스트를 찾아낼 수 있습니다.

주요 메타문자와 기능

1. . (점)

.는 "임의의 문자 하나"를 의미합니다. 즉, 어떤 문자든 해당 위치에 올 수 있다는 뜻입니다. 예를 들어, 패턴 a.b는 "a" 다음에 어떤 문자가 오고 그 뒤에 "b"가 오는 패턴을 의미하며, "acb", "a1b", "a_b" 등이 일치합니다.

a.b  → "a"와 "b" 사이에 어떤 문자든 하나가 있는 문자열

2. ^ (캐럿)

^는 문자열의 "시작"을 의미합니다. 특정 패턴이 문자열의 시작에 위치해야 한다는 조건을 부여합니다. 예를 들어, ^abc는 "abc"가 반드시 문자열의 처음에 있어야만 일치합니다.

^abc  → 문자열이 "abc"로 시작하는 경우만 일치

3. $ (달러)

$는 문자열의 "끝"을 의미합니다. 패턴이 문자열의 마지막에 위치해야 일치하게 됩니다. 예를 들어, xyz$는 "xyz"가 반드시 문자열의 끝에 있어야 일치합니다.

xyz$  → 문자열이 "xyz"로 끝나는 경우만 일치

4. * (별표)

*는 바로 앞의 문자가 "0회 이상 반복"될 수 있음을 나타냅니다. 예를 들어, 패턴 a*는 "a"가 0번 이상 반복될 수 있으므로, 빈 문자열, "a", "aa", "aaa" 등이 모두 일치합니다.

go*  → "g" 다음에 "o"가 0번 이상 반복되는 패턴

5. + (더하기)

+는 바로 앞의 문자가 "1회 이상 반복"될 수 있음을 나타냅니다. +*와 달리 반드시 한 번 이상 나타나야 합니다. 예를 들어, a+는 "a", "aa", "aaa" 등과 일치하지만, 빈 문자열과는 일치하지 않습니다.

go+  → "g" 다음에 "o"가 1번 이상 반복되는 패턴

6. ? (물음표)

?는 바로 앞의 문자가 "0회 또는 1회" 나타날 수 있음을 의미합니다. 예를 들어, colou?r는 "color" 또는 "colour"와 일치합니다.

colou?r  → "u"가 있을 수도, 없을 수도 있는 패턴

7. [] (대괄호, 문자 클래스)

[]는 "문자 클래스"를 정의하며, 대괄호 안에 포함된 문자 중 하나와 일치합니다. 예를 들어, [aeiou]는 하나의 모음(a, e, i, o, u)과 일치합니다. 또한, 범위를 지정할 수 있는데, [a-z]는 소문자 알파벳 중 하나와 일치합니다.

h[aeiou]t  → "h"와 "t" 사이에 모음이 오는 패턴

8. | (파이프, OR 연산자)

|는 OR 연산자로, 두 가지 이상의 패턴 중 하나와 일치할 때 사용됩니다. 예를 들어, cat|dog는 "cat" 또는 "dog"와 일치합니다.

cat|dog  → "cat" 또는 "dog"와 일치

9. () (소괄호, 그룹화)

()는 패턴을 그룹화하여 하나의 단위로 처리하거나, 그룹 안에 있는 내용을 캡처할 수 있습니다. 또한, 그룹화된 패턴을 반복하거나, OR 연산자와 결합할 수 있습니다. 예를 들어, (ab)+는 "ab"가 하나 이상 반복되는 패턴과 일치합니다.

(ab)+  → "ab"가 1번 이상 반복되는 패턴

정규 표현식의 고급 기능

1. 긍정형 전방탐색(Positive Lookahead, (?=...))

긍정형 전방탐색은 특정 패턴이 뒤에 오는지 확인하지만, 그 패턴은 최종 일치에 포함되지 않습니다. 예를 들어, a(?=b)는 "a" 뒤에 "b"가 오는 경우만 "a"를 일치시킵니다.

2. 부정형 전방탐색(Negative Lookahead, (?!...))

부정형 전방탐색은 특정 패턴이 뒤에 오지 않는지 확인합니다. a(?!b)는 "a" 뒤에 "b"가 없는 경우에만 "a"를 일치시킵니다.

정리

정규 표현식은 텍스트에서 특정 패턴을 찾고, 변형하고, 검증하는 데 매우 강력한 도구입니다. 이를 통해 간단한 문자열부터 복잡한 패턴까지 다양한 방식으로 텍스트를 처리할 수 있습니다. 정규 표현식의 기본 원리는 "일치"를 중심으로 하며, 일반 문자와 메타문자를 활용해 패턴을 구성합니다.

반응형