관리 메뉴

피터의 개발이야기

[Java] 정규식 사용법 정리, Pattern, Match 본문

Programming/JAVA

[Java] 정규식 사용법 정리, Pattern, Match

기록하는 백앤드개발자 2023. 2. 17. 01:03
반응형

 

 

ㅁ 개요 

 개발을 하면서 정규식을 다양하게 사용하게 된다. 로그분석 시 텍스트에서 특정패턴의 값을 추출할 때도 있고, 로그인 시 비밀번호와 이메일의 정합성을 식별하기 위해서도 정규식을 사용한다. 이 글에서는 그 정규식에 대해서 정리하고 자주 사용하는 패턴들에 대해서 정리하였다.

 

 

ㅁ 정규식이란?

 정규식이란 사전적인 의미로는 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어를 말한다. 주로 문자열의 검색과 치환을 위한 용도로 많이 쓰이고 있다. 입력한 문자열에서 특정한 조건의 문자를 추출하는 경우 일반적인 방법은 다소 복잡하고 반복적인 경우가 발생하지만, 정규식을 이용하면 매우 간단하게 표현하고 식별할 수 있다. 하지만 코드는 간소화 되었지만 정규식 자체의 복잡도로 인해 가독성이 많이 떨어지는 문제점이 있다.

 

 

ㅁ 자주 사용하는 정규 표현식

정규 표현식 설명
^[0-9]*$ 숫자
^[a-zA-Z]*$ 영문자
^[가-힣]*$ 한글
\\w+@\\w+\\.\\w+(\\.\\w+)? E-Mail
^\d{2,3}-\d{3,4}-\d{4}$ 전화번호
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ 휴대전화번호
\d{6} \- [1-4]\d{6} 주민등록번호
^\d{3}-\d{2}$ 우편번호

 ㅇ 자주 쓰는 정규식이지만 매번 정규식 문법을 전체적으로 이해하지 못하고 단편적으로만 이해를 했었다.

 

 

 ㅁ 경계 측정기

정규 표현식 설명
^ 문자열 시작
$ 문자열 종료
. 임의의 한 문자(단 \은 넣을 수 없음)
* 앞 문자가 없을 수도 무한정 많을 수도 있음
+ 앞 문자가 하나 이상
? 앞 문자가 없거나 하나 있음
[ ]  문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타냅니다.
[] 내에서 ^ 가 선행하여 존재하면 not을 나타낸다.
{ }  횟수 또는 범위를 나타냅니다.
( ) 소괄호 안의 문자를 하나의 문자 그룹으로 인식
\ 정규 표현식 역슬래시(\)는 확장문자 (역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고
역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미)
\b 단어의 경계
\B 단어가 아닌것에 대한 경계
\A 입력의 시작 부분
\G 이전 매치의 끝
\Z 입력의 끝이지만 종결자가 있는 경우
\z 입력의 끝

 ㅇ 문자열을 분석하기 위해서 우선 경계를 정하는 정규 표현식을 알아야 한다. 

 ㅇ 예를 들어, 이미지들이 Good_0001.png처럼 특정한 이름 지정 규칙을 따랐는데, 
     이 이미지들만을 반환하고 싶으면, ^(Good.+)\.png$와 같이 쓸 수 있다.

 

ㅁ 논리 연산자

정규 표현식 설명
XY 문자열 시작
X|Y 패턴 안에서 or 연산을 수행할 때 사용
( ) 소괄호 안의 문자를 하나의 문자 그룹으로 인식

 

 

ㅁ 문자 클래스

정규 표현식 설명
[abc] a, b, c중 하나이면 일치 합니다.
[^abc] a, b, c를 제외한 다른 글자 이면 일치합니다.
[a-zA-Z] a 부터 z까지의 소문자 알파벳 이거나 A 부터 Z까지의 대문자 알파벳 중의 하나라면 일치합니다.(범위)
[a-d[m-p]] a 부터 d까지, 또는 m 부터 p까지 중에 하나와 일치합니다: [a-dm-p] (합집합)
[a-z&&[def]] d, e, f 중의 하나와 일치합니다. (교집합)
[a-z&&[^bc]] b와 c를 제외한 a 부터 z까지 중의 하나와 일치합니다: [ad-z] (차집합)
[a-z&&[^m-p]] m부터 p 까지를 제외한, a 부터 z까지 중의 하나와 일치합니다: [a-lq-z] (차집합)

 ㅇ 매칭될 문자를 지정하거나, 제외시킬 때에 사용된다.

 

 

ㅁ 사전 정의된 문자 클래스

정규 표현식 설명
. 임의의 문자 (라인 종결자와 일치할 수도 하지 않을 수도 있음)
\d 숫자 문자: [0-9]
\D 숫자 문자가 아닌것: [^0-9]
\s 화이트 스페이스 문자: [ \t\n\x0B\f\r]
\S 화이트 스페이스 문자가 아닌것: [^\s]
\w 알파벳 단어 문자(word 문자): [a-zA-Z_0-9]
\W 알파벳 단어 문자가 아닌것: [^\w]

 ㅇ 사전에 약속된 정규 표현식이다. 

 ㅇ 이 중에서 .* 은 모든 문자를 뜻한다. 

 

 

ㅁ 수량화

Greedy quantifiers Reluctant quantifiers Possessive quantifiers Desc
X? X?? X?+ X가 없거나 한번 나옴
X* X*? X*+ X가 없거나 한번 이상 나옴
X+ X+? X++ X가 한번 또는 여러번 나옴
X{n} X{n}? X{n}+ X가 정확히 n번 나옴
X{n,} X{n,}? X{n,}+ X가 n번 이상 나옴
X{n,m} X{n,m}? X{n,m}+ X가 n이상 m이하로 나옴

ㅇ ?는 앞에 있는 문자 또는 그룹이 0 또는 1개와 일치할 때에 true가 된다.

ㅇ 예를 들어, 12?3은 123 또는 13과 일치

 

ㅁ 특수구조

정규표현식 설명
(?<name>X) X, 이름 있는 캡처 그룹으로서
(?:X) X, 캡처하지 않는 그룹으로서
(?idmsuxU-idmsuxU)  아무 것도 아니지만 일치 플래그 id m s u x U를 켜고 끕니다 .
(?idmsux-idmsux:X)   X, 비캡처 그룹으로서지정된 플래그 Idmsux 온 오프
(?=X) X, 제로 폭 플러스 예측 사용
(?!X) X, 제로 폭 마이너스 예측 사용
(?<=X) X, 제로 폭 포지티브 백을 통해
(?<!X) X, 제로 폭 마이너스 뒷면을 통해
(?>X) X, 독립된 비캡처 그룹으로서
 ㅇ (?<name>X)의 그룹화를 통해 필요한 데이터를 바로 추출할 수 있다.
 
 
public static void main(String[] args){

    String txt = "[200][url][browser][date]";
    Matcher m = Pattern.compile("\\[(?<status>[0-9]+)\\]\\[(?<url>.*)\\]\\[(?<browser>.*)\\]\\[(?<date>.*)\\]").matcher(txt);
    while (m.find()) {
        System.out.println( m.group(0)); // 전체
        System.out.println( m.group("status"));
        System.out.println( m.group("url"));
        System.out.println( m.group("browser"));
        System.out.println( m.group("date"));
    }
}
    
/*
[200][url][browser][date]
200
url
browser
date
*/
 
 ㅇ Pattern과 matcher를 이용하고, 정규식의 캡처 그룹의 이름을 지정하여 원하는 값을 바로 추출할 수 있다.
 
 
 
ㅁ Pattern 클래스

정규 표현식에 대상 문자열을 검증하는 기능은 java.util.rege.Pattern 클래스의 matches()메소드를 활용하여 검증할 수 있다.

 

 

ㅁ Pattern 클래스 주요 메서드

compile(String regex): 주어진 정규표현식으로부터 패턴을 만듭니다.
matcher(CharSequence input): 대상 문자열이 패턴과 일치할 경우 true를 반환합니다.
asPredicate(): 문자열을 일치시키는 데 사용할 수있는 술어를 작성합니다.
pattern(): 컴파일된 정규표현식을 String 형태로 반환합니다.
split(CharSequence input): 문자열을 주어진 인자값 CharSequence 패턴에 따라 분리합니다.

 

 

ㅁ Matcher 클래스

Matcher 클래스는 대상 문자열의 패턴과 일치하는지 판별할 때 주로 사용된다. 

Pattern 객체의 matcher(CharSequence input) 메소드를 이용하여 생성할 수 있다. 

CharSequence 라는 인터페이스를 사용함으로써 다양한 형태의 입력데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있다.
Matcher객체는 Pattern객체의 matcher() 메소드를 호출하여 받아올 수 있다.

 

 

ㅁ Matcher 클래스 주요 메서드

matches() : 대상 문자열과 패턴이 일치할 경우 true 반환합니다.
find() : 대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동합니다.
find(int start) : start위치 이후부터 매칭검색을 수행합니다.
start() : 매칭되는 문자열 시작위치 반환합니다.
start(int group) : 지정된 그룹이 매칭되는 시작위치 반환합니다.
end() : 매칭되는  문자열 끝 다음 문자위치 반환합니다.
end(int group) : 지정되 그룹이 매칭되는 끝 다음 문자위치 반환합니다.
group() : 매칭된 부분을 반환합니다.
group(int group) : 매칭된 부분중 group번 그룹핑 매칭부분 반환합니다. 
groupCount() : 패턴내 그룹핑한(괄호지정) 전체 갯수를 반환합니다.

 

 

ㅁ 정규식 테스트 및 생성 페이지

 정규식을 구현하는데 유용한 웹페이지를 발견하였다. 원하는 정규식을 선택하여 필요한 정규식 패턴을 완성하고 적용을 원하는 텍스트에 바로 테스트 할 수 있는 웹 페이지이다. 정규식 패턴의 목록에서 확인하고 적용하면서 정교한 정규식 패턴을 완성할 수 있는데 도움이 되는 페이지이다. 정규표현식에 대한 지식이 부족하여도 왼쪽의 샘플들과 그에 대한 설명을 통해 원하는 정규식 패턴을 완성할 수 있다.  

 

https://regexr.com

 

https://regexr.com/

 ㅇ 화면 왼쪽에는 정규식들의 설명과 예시를 확인할 수 있고, 오른쪽에는 적용 텍스트에서 테스트를 해 볼 수 있는 웹페이지이다.

 

 

 

 ㅇ 정규식의 큰 카테고리를 선택할 수 있다.

 

 ㅇ 정규식에 대한 설명과 예시를 확인할 수 있으며, 아래쪽에는 정규식에 대한 설명을 확인할 수 있다.

 

 

ㅁ 정규식패턴 도식화 페이지

정규식은 함축적인 내용을 담고 있기 때문에 정규식패턴을 이해하기는 쉽지 않다. 그래서 이를 도식화하여 정규식패턴을 쉽게 이해할 수 있도록 도움을 주는 정규식패턴 도식화 페이지를 소개한다.

 

https://regexper.com/

 ㅇ 작성한 정규식 패턴을 입력하면 도식화하여 정규식 패턴의 기능을 쉽게 이해할 수 있게 한다.

 

 

ㅁ 함께 보면 좋은 사이트

https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

 

Pattern (Java Platform SE 8 )

Enables canonical equivalence. When this flag is specified then two characters will be considered to match if, and only if, their full canonical decompositions match. The expression "a\u030A", for example, will match the string "\u00E5" when this flag is s

docs.oracle.com

 

https://regexr.com/

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

 

반응형
Comments