On this page
정규표현식 - 01. 입문 정규표현식
On this page
다양한 언어로 배우는 정규표현식을 보고 제 나름대로 정리한 내용입니다.
- 정규표현식이란, 수학에서 사용되는 식과 비슷하기 무언갈 표현하는 '식'이다.
- 정규표현식에서는 구성요소와 연산자를 조합하여 식을 구성한다.
- 구성요소
- 수식의 숫자나 화학힉의 원소 기호에 해당하는 기호
- 연산자
- 수식의 덧셈 곱셉에 해당하는 기호
- 구성요소
정규표현 기본
패턴과 일치
x * (y+z)
와x * y * z
의 결과가 다른것처럼 정규표현식에서도 패턴에 대한 일치 따라 결과가 달라진다.1(0|1|2|3)
vs10|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
,+
,?
- e. g.
- 몇몇 메타 문자들은 다른 메타 문자와 리터럴과 함께 사용되어야만 의미를 가진다. 이런 작성법을 구문이라고한다.
정규표현 엔진
- 정규표현식 일치 처리를 담당하는 소프트웨어
- 당연하게도 엔진이 다르면 지원하는 기능이나 구문도 달라진다. (언어마다 엔진이 다를 수 있다.)
문자열과 문자열 처리
컴퓨터와 문자열
- 컴퓨터에서는 모든 데이터가 결국 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연산 사용시 각 연산자의 우선순의를 주의해야한다.
- 우선순위
- 반복 (*)
- 접합 (두 단어를 잇는 행위)
- 선택 (|)
- 제곱, 곱셈, 덧셈순으로 생각하자
- 예를 들어
hoge|fuga
라는 정규표현식을 반복하려면(hoge|fuga)*
처럼 사용해야한다.hoge|fuga*
로 작성하면 반복 연산자의 우선순위가 더 높기 때문에 의도치 않은 결과가 나온다.
정규표현식의 신택스 슈가
정규표현식이 발전하면서 정규표현식 엔진은 신택스 슈가(syntax sugar)를 추가하여 필요한 기능들을 구현했다.
더 편리한 구문에 대한 요구
- 기본 3연산만으로는 복잡하게 작성해야했던 정규표현식들은 수량자, 점, 문자 클래스, 이스케이프, 앵커등이 추가되면서 더 간단하게 표현할 수 있게되었다.
수량자
*
- 0회 이상 임의의 횟수만큼 반복하는 연산자
- 최근 정규표현식에는
*
처럼 동작하는 다른 연산자들이 추가되었다.
+
- 1회 이상 반복을 표현하는 연산자
- 예를 들어
ab+c
는ac
에는 일치하지 않고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]
- 0~9:
문자 클래스 범위 지정
-
를 통해 범위를 지정한다.- 문자 클래스의 범위 지정은 아스키 코드의 순서를 따른다.
-
라는 문자 자체를 문자 클래스 안에 넣고 싶은 경우, 문자 클래스 맨 뒤, 맨 앞에 기입하자.
부정
^
는 문자 클래스 내부에서 부정(not)으로 작동한다.
이스케이프
- 탭 문자, 줄바꿈 문자 등 표시 불가능한 문자는 이스케이프(
\
)를 통해 나타 낼 수 있다.- 이스케이프 문자들은 아스키 코드에서 확인 가능하다.
- 문자 클래스 내부에서 사용되는 메타 문자(
*
,^
,-
등)을 문자로써 사용하려면 앞에 이스케이프 처리를 하면 된다.
앵커
- 문자열이 아닌 위치에 일치하는 메타 문자이다.
- 예를 들어 '행 처음'에 일치하거나 '행 끝'에 일치하는 부분을 찾을 때 사용한다.
- 주요 앵커
^
- 행 처음
$
- 행 끝
\A
- 텍스트 선두
\b
- 문자열 사이
\B
- 문자열 사이 외
\z
- 텍스트 끝
- 문자열 사이라는게 무슨 말일까?
- 정규표현식에서는 문자와 문자사이 빈 영역도 하나의 문자로 평가한다
abc
- a와 b사이, b와 c사이에는 공백문자열이 존재하는 것이다. 우리가 글자를 입력할 때 생기는 커서를 생각해보자
- 정규표현식에서는 문자와 문자사이 빈 영역도 하나의 문자로 평가한다
캡쳐와 치환: 정규표현식으로 문자열을 조작한다.
문자열 부위: 접두사, 접미사, 부분 문자열
일치의 종류
서브 패턴과 서브 매치
캡쳐
캡쳐 없이 그룹화
서브 매치의 우선순위
정규표현식을 이용한 문자열 치환
문자열 치환 툴
정규표현식의 확장 기능: 전방 탐색/재귀/역참조
전방 탐색
재귀
역참조
기본 3연산으로 표현할 수 없는 패턴
정규표현식의 엔진의 기본
정규표현식 엔진의 종류 (DFA형과 VM형)
DFA형 키워드: 결정성과 비결정성
- DFA
- 결정성 유한 오토마타
- NFA
- 결정성을 가진 유한 오토마타와 갖지 않는 오토마타를 통틀어서 말하는 것
유한 오토마타로 정규표현식에 대한 이해를 높인다
VM형 키워드: 백트랙
다음 장 이후부터의 내용 구성
Tags
Edit this page
최근 수정 시각 11/6/2022