Regular Expression (정규표현식)

Regular Expression(정규 표현식)은 줄여서 REGEX(레젝스) 라고 부르기도 한다.

특정한 패턴의 문자열을 검색하고 필요하면 편집하기 위해 사용한다.

정규 표현식은 다음과 같이 분류할 수 있다.

  • POSIX Regular Expression (UNIX 계열 표준 정규 표현식)
    • BRE (Basic Regular Expression)
    • ERE (Extended Regular Expression)
      • BRE에 추가적인 메타 문자 등을 제공
  • PCRE (Perl Compatible Regular Expression)

?, +, {} 등의 메타 문자는 ERE에서만 사용 가능하다.


Meta character (메타 문자) a.k.a Wild card character

IT용어사전에서 정의하고 있는 메타 문자의 사전적인 의미는 다음과 같다.

정규 표현식에서의 메타 문자는

다른 문자의 정보를 운반하기 위해 프로그램 소스나 데이터에 끼워 넣는 문자.

예를 들면 C언어 프로그램에 사용된 백슬레시가 그 예인데, 이 문자 다음에 오는 문장은 확장 문자열(escape sequence)에 속하는 부분으로서 주변 장치와 프로그램에 대해서 어떤 명령을 수행하도록 하는 제어 문자로 사용된다.
[네이버 지식백과]

메타 문자설 명비 고
.모든 문자
|왼쪽 또는 오른쪽과 일치cat|dog
[]문자 집합 중 하나와 일치[a-z]면 a-z 중 하나
[^]문자 집합을 제외하고 일치[^a-z]면 a-z가 아닌 것 중 하나
*문자가 0개 이상 반복될 때
+문자가 1개 이상 반복될 때
{n}문자가 n번 반복될 때a{3}
{m, n}문자가 m번 이상 n번 이하 반복될 때
{n,}문자가 n번 이상 반복될 때
\Escape
[\b]Back space
\fForm Feed
\nLine Feed
\rCarrige Return
\tTab
\vVertical Tab
\d0~9 사이의 숫자 하나[0-9]
\D숫자를 제외한 문자 하나[^0-9]
\w대소문자와 밑줄을 포함하는 모든 영숫자[a-zA-Z0-9]
\W영숫자가 아니거나 밑줄이 아닌 모든 문자[^a-zA-Z0-9]
\s모든 공백 문자[\f\n\r\t\v]
\S공백 문자가 아닌 모든 문자[^\f\n\r\t\v]
\x16진수 표현\x0A (=ascii 10 == \n)
\08진수 표현\011 (=ascii 9 == \t)
\c제어문자\cZ (Ctrl+Z)
^, \A문자열의 시작 ([] 밖에 있을 때)
$, \Z문자열의 끝
\< 단어의 시작과 일치
\> 단어의 끝과 일치
\b 단어 경계와 일치
\B 단어 경계가 아닐 때 일치
() group 또는 back reference를 정의한다.
?= 전방탐색
?<= 후방탐색
?! 부정형 전방탐색
?<! 부정형 후방탐색
\l 다음에 오는 글자를 소문자로 변환
\L \E를 만날 때까지 모든 문자를 소문자로 변환
\u 다음에 오는 글자를 대문자로 변환
\U \E를 만날 때까지 모든 문자를 대문자로 변환
\E \L 또는 \U 의 End point
  • 줄 바꿈

    • Windows: \r\n
    • UNIX, LINUX: \n
  • 읽는 법

    • !: Exclamation point
    • “: Quotation mark
    • ‘: Apostrophe
    • `: Grave
    • .: Period
    • ^: Caret
    • *: Asterisk
    • -: Hyphen
    • _: Underscore
    • ~: Tilde
    • &: Ampersand
    • (): Parenthesis
    • {}: Brace
    • []: Bracket
    • <>: Chevron

Back reference

  • 매칭된 결과를 다시 사용하는 패턴
  • ()로 묶인 패턴 매칭을 \# 형태로 재사용할 수 있다. #은 숫자.
    • \1, \2, \3 …
    • ex. (a) = \1 의 매칭 결과는 a = a 가 된다.
  • HTML Tag를 parsing할 때 굉장히 효율적이다.
    • ex. <(table)>[.]*<\/\1>

REGEX in JAVA

JAVA에서 정규 표현식을 사용하여 Pattern을 찾기 위해서는 아래와 같이 코드를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String data = "dog, cat and wolfwolfwolfwolfwolf";
Pattern p = Pattern.compile("^(dog), (cat) and (wolf){3}");
Matcher m = p.matcher(data);
if (m.find()) {
System.out.println(m.group(0)); // 매칭된 full string
System.out.println(m.group(1)); // 매칭된 full string 내의 첫 번째 group
System.out.println(m.group(2));
System.out.println(m.group(3));
System.out.println(m.group(4)); // 이 예제에서 4번째 group은 없으므로 exception 발생
}
}
}

위 코드의 수행 결과는 다음과 같다.

1
2
3
4
5
6
7
dog, cat and wolfwolfwolf
dog
cat
wolf
Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 4
at java.util.regex.Matcher.group(Unknown Source)
at com.lazyrodi.Main.main(Main.java:19)

위 코드에서 일치하는 다음 문장을 찾기 위해서는 m.find() 를 한 번 더 수행하면 다음 매칭되는 문장을 찾는다.

Pattern Class 및 Matcher Class에 대한 자세한 정보는 JavaDoc (Pattern, Matcher)을 참조하자.


Tip

https://regexper.com 라는 웹사이트에서 정규 표현식을 시각적으로 확인할 수 있게 도와주고 있다. 개인적으로 짱짱맨 사이트라고 생각한다.

JavaScript에 대한 정규표현식 사용은 Mozilla 사이트에서 잘 설명하고 있다.

예시 1

1
^(dog), (cat) and (cat){3}

Regexper 결과 1


출처

아래의 글들을 교재삼아 작성하였습니다.

Share