Java Regular Expression

Rowan Lee·2024년 12월 31일

자바

목록 보기
8/10

Regular Expression은 줄여서 Regex(REGular EXpression) 이라고 부르기도 한다. 정규표현식이란 오토마타 이론에서 정규언어를 정의할 수 있는 표현식을 의미한다. 프로그래밍 언어에서는 문자열 데이터 중에서 특정규칙의 일치하는 부분을 선택하고 싶을때 주로 정규표현식을 사용한다.

정규표현식 문법

여기서는 그 중에서도 자주 쓰는 표현식을 소개한다. 자바를 기준으로 작성하였으나 대부분의 언어가 밑과 유사한 형태를 사용한다.

문자 클래스

문자의 종류를 구분하는데 사용하는 클래스

정규식 패턴설명패턴 종류
\\w문자를 의미a-z, A-Z, 0-9, "_", ㄱ-ㅎ, 가-힣, ...
\\W문자가 아닌 것을 의미
\\d숫자를 의미0-9
\\D숫자가 아닌 것을 의미
\\s공백 또는 탭
\\S\\s 가 아닌 것

정규표현식 기호

정규식 패턴설명패턴 종류
.개행(줄바꿈)문자 제외 임의의 문자 1개\\w와는 달리 띄어쓰기 같은것도 포함
ab|bcab 또는 bc
\사전정의된 문자를 표현하는 이스케이프 문자

어설션

매칭할 문자열의 시작이나 끝을 검사

정규식 패턴설명
^문장의 시작
$문장의 끝

수량자

일치시킬 문자 또는 표현식의 수를 의미, 일종의 반복을 표현하기 위해 사용

정규식 패턴설명
?zero or one
*zero or many
+one or many
{n}n개(정확하게 n)
{n,}n개 이상
{n, m}n개 이상 m개 이하

그룹과 범위

정규식 문법을 그룹화하거나 범위를 지정할 때 사용하는 패턴

정규식 패턴설명
[]문자셋, 괄호안의 어떤 문자던
[^]부정 문자셋, 괄호안의 어떤 문자가 아닐때
()그룹
(?:)찾지만 그룹에 포함 안됌

수학적 분석과 한계

정규표현식은 초반에도 설명했지만 오토마타 이론으로 수학적으로 엄밀하게 정의되어 있다. 간단히 요약하면 정규언어를 정의할 수 있는 하나의 표현 방법이다. 프로그래밍에서 문자열 중에 매칭되는 것을 해당 개념으로 이해해보면, 작성한 정규표현식에 따라 생성할 수 있는 정규언어의 집합에 포함되어 있는 문자열이라면 선택하고, 아니라면 선택하지 않는 것이다.

즉 정규언어가 아니라면 정규표현식을 통해서 매칭시킬 수 없다.

성능분석

NFA, DFA, 정규표현식은 문법의 일종이며 이는 수학적으로 동치이다. 문법에서 동치는 생성할 수 있는 언어의 집합이 동일함을 의미한다. 어떤 언어가 정규표현식으로 정의가능하다면 NFA나 DFA로도 정의가능하다.

정규표현식 <-> NFA <-> DFA

상호변환 알고리즘은 이런식으로 존재하며 정규표현식에서 DFA로 변환하는 과정은 NFA를 거쳐 변환된다. 이때 NFA의 경우 검사를 DFS와 같은 로직으로 검사해야 하며 DFA는 선형시간에 검사가능하다.

문법최초 구성 시간검사 시간설명
정규표현식xx정규표현식은 그 자체로는 컴퓨터가 검사 할 수 없기에 NFA나 DFA로 다룬다.
NFAO(n)O(n*m)DFA로 변환하는 것에 비해 최초 구성시간은 아끼지만 검사시간은 느리다.
DFAO(2^n)O(m)NFA로 다루는 것에 비해 변환 최초 구성시간이 들지만, 검사가 빠르다.

여기서 n은 상태의 개수, m은 검사할 문자열의 길이를 의미한다.

이런식으로 성능상의 트레이드 오프가 있지만 대부분의 언어는 NFA로 다루는 방법을 채택하고 있다. 자바도 NFA기반의 정규표현식 검사를 진행한다.

따라서 자바 정규표현식의 시간복잡도는 검사 시간의 영향을 크게 받으며, 일반적으로 정규표현식이 복잡하지 않다면 O(m)이지만 복잡한 식은 직접 조건에 맞춰 검사하는 것이 오히려 빠를 수 있다.

자주쓰는 정규표현식 메서드

https://velog.io/@solfe/JAVA-코딩테스트-정리#정규표현식

정규표현식 연습 사이트

https://regexr.com/

참고

가독성 매우 좋음 추천: https://inpa.tistory.com/entry/JAVA-☕-정규식Regular-Expression-사용법-정리

https://adjh54.tistory.com/104

profile
CS/Software Engineer

0개의 댓글