본문 바로가기
Java

[JAVA] 정규 표현식 - Matcher, Pattern, find(), group()

by soro.k 2022. 7. 13.

 

 

정규 표현식이란?


정규 표현식은 특정한 패턴을 이루고 있는 문자들이 나열된 것으로, 글이 하나 있다고 가정할 때 그 안에서 내가 원하는 특정한 패턴의 문자를 찾을 때 사용한다. 

 

자바에서 정규 표현식은 java.util.regex 패키지 안에 있는 클래스들을 활용하여 사용한다.

1️⃣ Pattern 클래스 : 패턴을 정의한다.

2️⃣ Matcher 클래스 : 패턴을 사용해 문자를 찾는 역할을 한다.

3️⃣ PatternSynctaxException 클래스 : 정규 표현식 패턴의 구문 오류를 나타낸다.

 

 

 

예제 1(Matcher, Pattern, find())


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main(String[] args) {
    Pattern pattern = Pattern.compile("w3schools", Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher("Visit W3Schools!");
    boolean matchFound = matcher.find();
    if(matchFound) {
      System.out.println("Match found");
    } else {
      System.out.println("Match not found");
    }
  }
}

- Pattern.compile() 메소드를 사용해 "w3schools"를 대/소문자 구분없이 검색하기 위해 패턴을 만든다. 

➡️ Pattern.compile()의 첫 번째 파라미터는 문장 안에서 찾을 패턴이고, 두 번째 파라미터는 선택 사항으로 어떻게 검색할지 지정하기 위해 사용한다.

- pattern.matcher() 메소드를 사용해 Matcher 객체에 해당 문자열에 패턴 조건을 검사해서 저장한다.

➡️ matcher()는 패턴을 검색할 때 사용한다.

- matcher.find() 메소드를 사용해 패턴의 일치/불일치 여부를 판단한다.

➡️ find()는 문자열 내에서 패턴을 찾으면 true를 반환하고 그렇지 않으면 false를 반환한다.

 

 

 

Flags


comepile() 메소드 내에서 검색 방법을 지정하기 위해 사용하는 플래그들이다.

1️⃣ Pattern.CASE_INSENSITIVE : 대소문자 무시

2️⃣ Pattern.LITERAL : 패턴 안에 있는 특수 문자를 일반 문자처럼 취급

3️⃣ Pattern.UNICODE_CASE : CASE_INSENSITIVE와 같이 사용하여 영어가 아닌 문자들도 대소문자 무시

 

 

 

예제 2(Matcher, Pattern, find(), group())


private String[] split(String text) {
    Matcher m = Pattern.compile("//(.)\n(.*)").matcher(text);
    if (m.find()) {
        String customDelimeter = m.group(1);
        return m.group(2).split(customDelimeter);
    }
    return text.split(",|:");
}

출처 : 자바 웹 프로그래밍 Next Step

- Pattern.compile("//(.)\n(.*)).matcher(text)

➡️ "//"와 "\n" 사이에 "(.)"는 임의의 한 문자를 하나의 문자로 인식하겠다는 의미로 이 문자로 구분자를 지정한다. 이후에 input값과 패턴 조건을 검색한다.

- m.group()

➡️ group()은 패턴과 일치하는 값이 없을 때까지 매칭되는 일련의 결과 값을 반환하는데 여기서 m.group(1)은 "(.)"을 찾은 결과 값으로 구분자가 반환되고 m.group(2)는 "(.*)"을 찾은 결과 값인 나머지 문자들이 반환된다.

 

 

 

정규 표현식 패턴


표현식 설명
^ 문자열의 시작
$ 문자열의 종료 
. 임의의 한 문자(\ 제외)
* 앞 문자가 없을 수도, 무한정 많을 수도 있음
+ 앞 문자가 하나 이상
? 앞 문자가 없거나 하나 있음
[] 문자의 집합이나 범위
{} 횟수 또는 범위
() 소괄호 안의 문자를 하나의 문자로 인식
| 패턴 안에서 or 연산 수행
\s 공백 문자
\S 공백 문자를 제외한 문자
\w 알파벳이나 숫자
\W 알파벳이나 숫자를 제외한 문자
\d 숫자 [0-9]
\D 숫자를 제외한 문자
\ 역슬래시 다음에 일반 문자가 오면 특수 문자로 취급, 특수 문자가 오면 그 문자 자체를 의미
(?!) 앞 부분에 넣어주면 대소문자를 구분하지 않음

 

예제

1️⃣ ^[0-9]*$

0부터 9까지의 수를 글자 수 제한을 하지 않고 검사(숫자면 됨)

2️⃣ ^[a-zA-Z]*$

소문자 a부터 z, 대문자 A부터 Z까지 글자 수를 제한을 하지 않고 검사(알파벳이면 됨)

 

 

 

 


ref.