Programming/Java

[Java] 정규 표현식 (Regular Expression)

Isaac S. Lee 2023. 8. 18. 10:53

정규 표현식은 특정한 패턴(규칙)을 가지는 문자열의 집합을 표현하는 식이다.

정규 표현식은 문자열을 검색하는 용도로 사용하며, 대다수 환경/프로그래밍 언어 등에서 지원한다.

Ctrl + F 검색 기능에서 Regular expressions를 체크하여 정규 표현식 검색을 할 수 있다.

 

💡정규 표현식의 구성 요소


x

x는 임의의 1개의 문자를 의미한다.

정규 표현식으로 특정 글자 하나를 입력하면 그 패턴과 똑같은 글자를 찾는 작업을 한다.

x가 a이면 a를 찾으라는 의미이며, x가 abc이면 abc를 찾으라는 의미이다.

 

출현 횟수

1. 생략 (아무것도 표현하지 않음)

바로 앞의 대상의 출현 횟수 1 > 생략 X, 중복 X

바로 앞의 대상의 출현 횟수가 1이면 생략이 안 되고, 중복도 안 된다는 뜻이다.

 

ex) abc
abc

아무것도 안 붙을 때에는 해당 문자가 생략 되어서도 안 되고, 중복이 되어서도 안 된다.

이는 abc 그대로의 단어만을 찾는다는 것을 의미한다.

 

2. ?

바로 앞의 대상의 출현 횟수 0~1 > 생략 O, 중복 X

바로 앞의 대상의 출현 횟수가 0~1이면 생략이 되고, 중복이 안 된다는 뜻이다.

ex) a?bc
abc, bc

a 뒤에 '?'가 들어갔다.
이 정규 표현식의 패턴은 abc를 찾을수도 있고, bc를 찾을 수도 있다. 만약 주어진 문자가 ac일 경우 찾지 못 한다.
그리고 aabc일 경우 a를 제외한 abc를 찾으며, bbbc일 경우 bb를 제외한 bc를 찾는다.

ex) a?b?c
abc, ac, ac, c

ex) (자바)?코드
자바코드, 코드

 

3. +

바로 앞의 대상의 출현 횟수 1~무한대 > 생략 X, 중복 O

바로 앞의 대상의 출현 횟수가 1~무한대이면 생략이 안 되고, 중복이 된다는 뜻이다.

 

출현 횟수가 한 번은 나와야 하며, 연속적이어야 한다.

abc를 찾는데, a가 여러 번 나와도 된다. 그래서 abc, aabc, aaabc, aaaaaaaaaaaaabc도 찾는다.

 

ex) (자바)+코드
자바코드, 자바자바코드, 자바자바자바코드

한 글자만 반복되는 게 아니라 그룹이 반복된다.

 

4. *

 바로 앞의 대상의 출현 횟수 0~무한대 > 생략 O, 중복 O

바로 앞의 대상의 출현 횟수가 0~무한대이면 생략이 되고, 중복이 된다는 뜻이다.

 

ex) a*bc
bc, abc, aabc, aaaaaaaaaaaaaabc

 

선택 (choice)

선택은 열거값 중 하나가 나오는 패턴이다.

 

1. [열거값]

ex) 12
"제 나이는 12살입니다."

"제 나이는 12살입니다."라는 문장에서 12라는 숫자를 찾으려고 한다.
그런데 [12]로 대괄호로 묶으면 완전히 다른 의미가 된다.
12가 아닌 1과 2를 [1 or 2]로 별도의 요소로 인식하여 따로 찾는다. 이를 자바로 표현하면 1 || 2가 된다

 

ex) [0123456789]

정규 표현식 [0123456789]는 모든 숫자를 찾겠다는 의미이다.

 

ex) [13579]
0123456789

한 자리 홀수만 찾겠다는 의미이다.

 

ex) [0123456789][0123456789][0123456789]
010-1234-5678

3자리로 된 숫자를 찾겠다는 의미이다.
이처럼 원하는 숫자의 개수를 지정하여 검색하는 것도 가능하다.

 

ex) [0123456789]+
0123456780

숫자중에 하나를 찾는 행위를 여러 번 해도 된다.
출현 횟수와 다른 문법들을 조합하여 사용하면 다양한 패턴을 만들어낼 수 있다.

 

[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]

주민등록번호는 숫자가 6번이 나오고 그 다음에 7번이 나와야 해서 +나 *로 표현하기 애매하다.

 

010-[0123456789]?[0123456789][0123456789][0123456789]-[0123456789][0123456789][0123456789][0123456789]

전화번호는 가운데 번호가 3자리일 수도, 4자리일 수도 있으므로 ?를 붙인다.

 

소문자

[abcdefghijklmnopqrstuvwxyz]+
[a-z]

 

대문자

[ABCDEFGHIJKLMNOPQRSTUVWXYZ]+
[A-Z]

 

대문자+소문자

[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]+
[A-Za-z]

 

한글

[가-힣]

영어 소문자가 한 글자 이상 나오는 문자를 찾을 때 이와 같이 작성할 수 있다.
만약 소문자만 찾으려고 하는데, 이클립스에 대문자를 찾는다면, 검색 기능에서 대소문자 구분을 안 하겠다고 설정했기 때문이다.
나열된 값은 순서를 지키지 않아도 된다.
대문자와 소문자 사이에는 6개 문자가 더 있기 때문에 바로 이어주면 안 된다.

 

ex) 홍[가-힣][가-힣]?
홍길동, 홍순신, 홍민

홍씨 이름을 가진 사람 찾을 때 위와 같이 작성할 수 있다.
?를 붙였기 때문에 외자일 경우에도 가능하다.

 

2. [^열거값]

대괄호에 XOR을 붙였다. 이는 열거값을 제외한 나머지의 모든 문자를 찾겠다는 것을 의미한다.

ex) [^0-9]+

숫자 다음부터 숫자를 만들기 전까지의 모든 문자를 찾는다.

 

출현 횟수 지정

바로 앞의 문자(집합)의 출현 횟수를 지정하면 ?, +, *에 대한 더 세밀한 패턴 지정이 가능하다.

 

1. {n}

n은 고정적인 출현 횟수이다.

ex) a{1}bc
abc

a가 1번 나오는 문자만을 찾는다.

 

ex) a{2}bc
aabc

a가 2번 나오는 문자만을 찾는다.

 

2. {n,m}

n은 최소 출현 횟수, m은 최대 출현 횟수이다. 따라서 n, m은 출현 횟수의 범위로 이해하면 된다.

ex) a{3,5}bc
aaabc, aaaabc, aaaaabc

 

3. {n,}

n은 최수 출현 횟수이며, m을 입력하지 않으므로 무한대를 표현한다.

ex) a{2,}bc
aabc, aaabc, aaaaaaaaaaabc

 

💡정규 표현식의 활용


주민등록번호

[0-9]{6}-[0-9]{7}

 

전화번호

010-[0-9]{3,4}-[0-9]{4}

 

한글 2~4자 단어

[가-힣]{2,4}

 

영문자 5자 이상 단어 + 파스칼 표기법

[A-Z][A-Za-z][4,}