Skip to content
On this page

정규표현식 - 01. 입문 정규표현식

다양한 언어로 배우는 정규표현식을 보고 제 나름대로 정리한 내용입니다.

  • 정규표현식이란, 수학에서 사용되는 식과 비슷하기 무언갈 표현하는 '식'이다.
  • 정규표현식에서는 구성요소와 연산자를 조합하여 식을 구성한다.
    • 구성요소
      • 수식의 숫자나 화학힉의 원소 기호에 해당하는 기호
    • 연산자
      • 수식의 덧셈 곱셉에 해당하는 기호

정규표현 기본

패턴과 일치

  • x * (y+z)x * y * z 의 결과가 다른것처럼 정규표현식에서도 패턴에 대한 일치 따라 결과가 달라진다.
    • 1(0|1|2|3) vs 10|1|2|3
  • 반복관련한 연산자를 수량자라고 부른다.
    • 전화번호는 010-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] 로 나타낼 수 있지만 수량자를 사용하면 010-[0-9]{4}-[0-9]{4} 로 표현 가능하다.
    • 여기서 수량자는 {4}

메타문자와 구문

  • 정규표현식에서 특별한 의미를 지닌 문자를 메타 문자 라고한다.
    • e. g. () , |, *, {}, ., $, \A, \b, \B, +, ?
  • 몇몇 메타 문자들은 다른 메타 문자와 리터럴과 함께 사용되어야만 의미를 가진다. 이런 작성법을 구문이라고한다.

정규표현 엔진

  • 정규표현식 일치 처리를 담당하는 소프트웨어
  • 당연하게도 엔진이 다르면 지원하는 기능이나 구문도 달라진다. (언어마다 엔진이 다를 수 있다.)

문자열과 문자열 처리

컴퓨터와 문자열

  • 컴퓨터에서는 모든 데이터가 결국 2진수의 바이너리 형태로 처리된다.
  • 문자열은 데이터 구조가 간단하기 때문에 사람이 조작하기 쉽다.

프로그래밍 단계

  • 실무에서 일상적으로하는 데이터 검증에 정규표현식은 자주 사용된다.
  • HTML5 내부에서 사용되는 <input type="email"/> 의 정규표현식도 완벽하진 않다.

유용한 작업들

  • 커맨드 라인 툴에 정규표현식을 사용하면 다양한 작업을 할 수 있다.
    • sed 을 통한 파일 내부 문자열 수정
    • egrap 을 통한 필요한 로그 문자열 추출

기본 3연산: 집합, 선택, 반복

패턴 연결

  • /rs/r 다음에 s가 연이어 온다는 패턴을 나타낸다. 즉 순서대로 연결돼 있음을 의미한다.
  • 정규표현식을 연결하는 연산을 집합이라고 한다.

패턴 선택

  • /r|s/r 또는 s 또는 둘을 연결한 rs 를 나타낸다.
  • | 로 나타내는 연산은 선택 또는 이라고한다.
  • [](문자클래스)를 활용해서 짧게 작성할 수도 있다.
  • 집합과도 조합이 가능하다
    • (...)? 라는 구문은 괄호내 패턴 또는 공백에 일치한다는 뜻이다.
    • (r)? 패턴은 (r|) 로 바꿔 쓸 수 있다. (공백문자열과 선택)

패턴 반복

  • \d*은 임의의 길이를 갖는 숫자를 의미한다.
  • * 반복연산은 정규표현식에 무한한 패턴을 나타낼 수 있는 능력을 준다. (클레이니 스타)

기본 3연산의 조합

  • 각 3연산을 하나만 사용하는 경우
    • 접합만 사용
      • abcd처럼 하나의 문자열만 표현 가능
    • 선택만 사용
      • 0|1|2|3|4처럼 '문자 하나'만 표현 가능
    • 반복만 사용
      • 0* 처럼 어떤 문자의 반복만 표현 가능
  • 각 연산을 같이 사용하는 경우
    • 접합/선택 사용
      • 국립대학을 표현할 때 제주대학|서울대학|강원대학 등으로 표현가능하다.

연산자 결합 순위

  • 3연산 사용시 각 연산자의 우선순의를 주의해야한다.
  • 우선순위
    1. 반복 (*)
    2. 접합 (두 단어를 잇는 행위)
    3. 선택 (|)
  • 제곱, 곱셈, 덧셈순으로 생각하자
  • 예를 들어 hoge|fuga라는 정규표현식을 반복하려면 (hoge|fuga)*처럼 사용해야한다. hoge|fuga*로 작성하면 반복 연산자의 우선순위가 더 높기 때문에 의도치 않은 결과가 나온다.

정규표현식의 신택스 슈가

정규표현식이 발전하면서 정규표현식 엔진은 신택스 슈가(syntax sugar)를 추가하여 필요한 기능들을 구현했다.

더 편리한 구문에 대한 요구

  • 기본 3연산만으로는 복잡하게 작성해야했던 정규표현식들은 수량자, 점, 문자 클래스, 이스케이프, 앵커등이 추가되면서 더 간단하게 표현할 수 있게되었다.

수량자

  • *
    • 0회 이상 임의의 횟수만큼 반복하는 연산자
    • 최근 정규표현식에는 *처럼 동작하는 다른 연산자들이 추가되었다.
  • +
    • 1회 이상 반복을 표현하는 연산자
    • 예를 들어 ab+cac에는 일치하지 않고 abbc에 일치한다.
    • (r)+r(r)*이 가리키는 패턴은 완전히 동일하다 -> 여기서 +는 신택스 슈가이다.
  • ?
    • 0회 또는 1회 반복을 표현하는 연산자
    • 수량자이며 물음표 연산이라고도 불린다.
  • {n, m}
    • n회부터 m회까지 반복해서 표현하는 연산자이다.
    • 범위 지정 반복제어, 범위 수량자라고 불린다.
    • x{1,5}x, xx는 포함하지만 xxxxxx는 포함하지 않는다.
    • m >= n 조건을 만족하지 않으면 에러가 발생한다.
  • .
    • 임의의 한문자를 표현한다.
    • r.*e 는 앞이 r 끝이 e로 끝나는 모든 문자열에 일치한다.

문자 클래스

  • 일련의 문자들을 패턴 안에 나타내고 싶은 경우 사용한다.

  • 문자 클래스는 []안에 표현하고 싶은 문자를 넣으면 된다.

  • 예시

    • 0~9: [0-9]
    • a~z: [a-z]
    • A~Z: [A-Z]
  • 문자 클래스 범위 지정

    • -를 통해 범위를 지정한다.
    • 문자 클래스의 범위 지정은 아스키 코드의 순서를 따른다.
    • -라는 문자 자체를 문자 클래스 안에 넣고 싶은 경우, 문자 클래스 맨 뒤, 맨 앞에 기입하자.
  • 부정

    • ^는 문자 클래스 내부에서 부정(not)으로 작동한다.

이스케이프

  • 탭 문자, 줄바꿈 문자 등 표시 불가능한 문자는 이스케이프(\)를 통해 나타 낼 수 있다.
    • 이스케이프 문자들은 아스키 코드에서 확인 가능하다.
  • 문자 클래스 내부에서 사용되는 메타 문자(*, ^, - 등)을 문자로써 사용하려면 앞에 이스케이프 처리를 하면 된다.

앵커

  • 문자열이 아닌 위치에 일치하는 메타 문자이다.
  • 예를 들어 '행 처음'에 일치하거나 '행 끝'에 일치하는 부분을 찾을 때 사용한다.
  • 주요 앵커
    • ^
      • 행 처음
    • $
      • 행 끝
    • \A
      • 텍스트 선두
    • \b
      • 문자열 사이
    • \B
      • 문자열 사이 외
    • \z
      • 텍스트 끝
    • 문자열 사이라는게 무슨 말일까?
      • 정규표현식에서는 문자와 문자사이 빈 영역도 하나의 문자로 평가한다
        • abc
          • a와 b사이, b와 c사이에는 공백문자열이 존재하는 것이다. 우리가 글자를 입력할 때 생기는 커서를 생각해보자

캡쳐와 치환: 정규표현식으로 문자열을 조작한다.

문자열 부위: 접두사, 접미사, 부분 문자열

일치의 종류

서브 패턴과 서브 매치

캡쳐

캡쳐 없이 그룹화

서브 매치의 우선순위

정규표현식을 이용한 문자열 치환

문자열 치환 툴

정규표현식의 확장 기능: 전방 탐색/재귀/역참조

전방 탐색

재귀

역참조

기본 3연산으로 표현할 수 없는 패턴

정규표현식의 엔진의 기본

정규표현식 엔진의 종류 (DFA형과 VM형)

DFA형 키워드: 결정성과 비결정성

  • DFA
    • 결정성 유한 오토마타
  • NFA
    • 결정성을 가진 유한 오토마타와 갖지 않는 오토마타를 통틀어서 말하는 것

유한 오토마타로 정규표현식에 대한 이해를 높인다

VM형 키워드: 백트랙

다음 장 이후부터의 내용 구성

Edit this page
최근 수정 시각 11/6/2022