[Regular Expression] 자바(Java) 정규표현식 사용방법

자바에서 정규표현식을 사용하려면 먼저 다음의 매쳐(Matcher), 패턴(Pattern) 두 가지를 임포트해야 합니다.

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

문자열 매칭

문자열 매칭을 하는 메소드를 하나 생성해보겠습니다.

사용방식은 간단해서 Pattern.compile 메소드로 정규표현식을 컴파일해서 패턴 객체를 생성한 후, 패턴 객체의 matcher() 메소드로 매칭할 문자열을 인자 값으로 넣어서 일치하는지를 확인합니다.

public void matchStr() {        
    Pattern pattern = Pattern.compile("^01[01678]-[0-9]{4}-[0-9]{4}$"); 
    Matcher match = pattern.matcher("010-1234-5678"); 
    boolean bool = match.matches();
    if(bool){
        System.out.println("Matched");
    }
}

 

일치하는지 여부를 불리언 값으로 얻으려면 matched() 메소드로 불리언 반환 값을 얻어야 합니다.

앞서의 매쳐와 패턴으로 일치하는 패턴을 찾는 코드는 문자열 멤버 메소드로 다음처럼 간편하게 작성할 수도 있습니다.

String str = "010-1234-5678";
String regEx = "^01[01678]-[0-9]{4}-[0-9]{4}$";
if (str.matches(regEx){
   System.out.println("Matched");
}

문자열 바꾸기

public void replaceStr() {
    String str = "입력하신 암호는 328642입니다.";
    String regEx = "[0-9]";
    Pattern pat = Pattern.compile(regEx);
    Matcher match = pat.matcher(str);
    String result = match.replaceAll("*"); // 대상 문자열의 숫자를 모두 *로 변경
    System.out.println("확인 : " + result);  // 확인 : 입력하신 암호는 ******입니다.
}

일회성일 때는 다음과 같이 간단한 문자열 멤버 메소드로 전체 문자열에서 일치하는 모든 문자(열)을 바꿀 수 있습니다. 자바스크립트와 마찬가지로 문자열 메소드들이 정규표현식을 지원합니다.

System.out.println(“확인 : ” + str.replaceAll(regEx, “*”));

하나씩 순서대로 찾기

Matcher 클래스의 멤버 메소드인 find()와 group()을 이용하면 일치하는 문자열을 하나씩 반환 받아 순차적으로 처리할 수 있습니다.

Matcher match = pat.matcher(str);
Int counter = 0;
while(match.find()){ // find()로 다음 번 매치되는 결과가 있는지 확인. 불리언 반환
    counter++;
    System.out.println("찾은 문자열 : " + match.group()); // 찾은 결과 문자열을 group() 메소드로 얻음.
}
System.out.println("찾은 개수 : " + counter);

자바 정규표현식 플래그 사용

자바 플래그는 컴파일 메소드를 호출할 때 두 번째 인자 값으로 속성을 넘기게 됩니다. 여러 개의 플래그를 사용할 때는 파이프로 나열해서 다음처럼 사용할 수 있습니다.

Pattern.compile(“[0-9]”, Pattern.MULTILINE | Pattern.DOTALL);

사용 가능한 플래그들은 다음과 같습니다. 플래그 표기는 “Pattern.플래그명”(예: Pattern.CASE_INSENSITIVE)으로 합니다.

다른 개발 언어와 달리 유닉스와 유니코드 관련 지원 속성들이 추가로 있습니다.

플래그

설명

CANON_EQ

플래그를 사용하면 두 개의 유니코드 문자를 조합해서 표현되는 다른 유니코드 문자를 같은 것으로 매칭 합니다.

예를 들어 플래그를 켜면 \u0066\u0066(연속된 두 개의 라틴 문자 “f”) 표현은 유니코드 문자 \uFB00 (“ff”)와 같은 것으로 매칭합니다.

CASE_INSENSITIVE

대/소문자를 구분하지 않고 일치 항목을 찾습니다. 영문 대소문자, 또는 대소문자를 구분하는 언어의 대소문자 구분을 무시합니다.

COMMENTS

정규표현식에서 이스케이프 되지 않은 공백을 매칭 패턴에서 제외합니다. 정규표현식 안에 사용한 공백을 무시합니다.

MULTILINE

여러 줄 모드를 사용합니다. 줄 바꿈 문자(\n)로 개행이 되는 각각의 행 마다 문장 시작과 끝을 한정하는 위치 한정자 ^과 $가 적용되도록 합니다.

UNICODE_CASE

정규표현식에 사용한 유니코드 문자(예: \u00fa) 표현 문자의 대소 문자 구분을 무시합니다.

CASE_INSENSITIVE가 영문 대소문자 구분을 하지 않는 것처럼 유니코드 문자 표현에 적용하는 플래그 입니다.

라틴어 Z를 표시하는 문자 Ȥȥ는 \u0224, \u0225로 각각 정규표현식에서 구분해 표현하지만 UNICODE_ CASE 플래그를 사용하면 구분하지 않고 같은 문자로 매칭합니다.

LITERAL

정규표현식의 모든 메타 문자를 일반 문자로 처리 합니다.

CASE_INSENSITIVE와 UNICODE_CASE 플래그를 함께 사용했을 경우, 이 플래그 속성은 그대로 유지 됩니다.

UNIX_LINES

유닉스 개행 처리를 사용합니다. 다른 운영체제와 달리 유닉스 개행 문자는 “\n”이며, “\r”은 일반 리터럴 문자 로 매칭됩니다.

호환성 문제가 발생할 수 있으므로 사용할 때 주의해야 합니다.

DOTALL

한 줄 모드를 사용합니다. 줄 바꿈 문자(\n)을 포함한 모든 문자와 일치하도록 아무 문자 일치 메타 문자(.)의 용도를 변경합니다. 개행 문자를 포함해 전체 문자열이 닷 메타 문자 일치에서 하나의 행으로 처리됩니다.

UNICODE_CHARACTER_CLASS

정규표현식 패턴과 입력 문자열에서 유니코드 문자를 지원합니다. \w, \s, \b와 같은 단어 메타문자에서 한글 단어 매칭이 가능해집니다.