Pattern, 어렵지 않게 사용하기

2020. 8. 18. 15:40Spring/Java

안녕하세요. 

이전 포스팅에서 알아본 정규식을 활용하여 java에서 사용하는 방법을 알아보려합니다.

정규식이 낯설다면 이전의 정규식 포스팅을 참고해주세요!

 

 

****************  참고  *****************

<🎡 정규식 사용하기 1부 - 기본 >

<🤖 정규식 사용하기 2부 - 심화>

******************************************** 

 


 

자바에서 정규식을 사용하려면 반드시 알아야하는 클래스가 두 개 있습니다.

바로, Pattern Class와 Matcher Class 입니다.

이제부터 두 클래스 중 Pattern 객체를 알아보도록 해볼게요 〰️ 

 

🔥 Pattern Class

Pattern Class는 JAVA에서 정규식을 사용하기 위해 가장 기초적으로 알아야할 객체입니다. 

java.util.regex 패키지에서 포함하고 있습니다.

이제부터 Pattern Class가 갖고 있는 8개의 method를 소개해드리겠습니다.

 

 

🧷 compile ()

✔️ static Pattern compile (String regex [,  int flags])

compile method는 String 값으로 들어온 정규식을 Pattern 객체로 바꿔줍니다.

아래는 method를 더 잘 이해하기 위한 사용 예시입니다!

 

// 예시 1

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

public class regex {
    static public void main(String[] args) {
        String REGEX = "([0-9]{2,3}-([0-9]{3,4}-[0-9]{4}))";
        String INPUT = "My number is 010-1234-5678. touch me.";

        Pattern pattern = Pattern.compile(REGEX);
        Matcher matcher = pattern.matcher(INPUT);

        if(matcher.find()) {
            System.out.println(matcher.group());  // 010-1234-5678
        }
    }
}

 

간단하죠 〰️

 

그런데 여기서 flags는 뭘까요❓ 

정규식을 매칭하는 방식에 비트 마스크를 적용합니다. 

flags 의 종류로는 CASE_INSENSITIVEMULTILINEDOTALLUNICODE_CASECANON_EQUNIX_LINESLITERALCOMMENTS 가 있습니다.

더 자세한 내용은 이 곳에 잘 명시되어 있어 한 번 살펴보시는 것도 좋을 것 같네요.

 

사용한 flags를 확인하고 싶다면, java.util.regex.Pattern.flags() 를 통해 확인할 수 있습니다. 

참고로, 위의 mehtod는 public int flags() 으로 정의되어 있습니다.

 

 

 

🧷 matcher ()

✔️Matcher matcher (CharSequence input)

 

compile method는 String 값으로 들어온 정규식을 Pattern 객체로 바꿔줍니다.

matcher method는 regex에 대해 input값과 매칭되는 Matcher객체를 만들어 반환합니다.

이 mehtod를 사용하려면 Matcher 객체에 대해 알아야겠죠❓

 

Matcher 객체는 아래에서 더 자세히 알아보도록 하겠습니다. 

참고로 말씀드리자면, [예시 1]에서도 matcher메소드를 사용했습니다.

 

 

 

🧷 matches  ()

✔️public static boolean matches (String regex, CharSequence input)

 

matches mathod는 첫 번째 인자로 받은 정규식을 컴파일하여 두 번째 인자로 받은 데이터에 매칭합니다.

만약, 정규식에 매칭되는 데이터면 true매칭되지 않다면 false를 반환합니다.

 

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

public class regex {
    static public void main(String[] args) {
        String REGEX = "([0-9]{2,3}-[0-9]{3,4}-[0-9]{4})";
        String INPUT1 = "010-1234-5678";
        String INPUT2 = "010-1234-5678로 연락주세요 ~";

        System.out.println(pattern.matches(REGEX, INPUT1));  // true
        System.out.println(pattern.matches(REGEX, INPUT2));  // false
    }
}

 

 위와 같이 전화번호를 검색하는 정규식에 맞는 데이터면 true를 출력하는 것을 확인할 수 있습니다.

 

 

 

🧷 pattern  ()

✔️public String pattern ()

 

Pattern 객체가 갖고 있는 정규식 pattern을 반환하는 method입니다.

 

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

public class regex {
    static public void main(String[] args) {
        String REGEX = "([0-9]{2,3}-[0-9]{3,4}-[0-9]{4})";
        String INPUT = "010-1234-5678";

        System.out.println(pattern.pattern());   // ([0-9]{2,3}-[0-9]{3,4}-[0-9]{4})
    }
}

 

 

🧷 quote ()

✔️ public static String quote (String s)

 

정규식을 사용해서 데이터를 매칭할 때, 만약 '[abc'를 포함하는 데이터를 검색하고 싶을 땐 어떻게 해야할까요❓ 

언뜻 보면 문제가 없어보이는데요.

 

괄호는 정규식에서 OR Operation을 사용할 수 있는 표현법이기 때문에 문제가 생기게 되죠.

 

// Error : Unclosed character class
"[123".matches("[123");

 

이럴 때 사용하는게 quote method입니다.

 

Pattern.quote("[123");	// "\Q[123\E"과 동일

/*
\Q 는 정규 표현식의 시작 표시
\E 는 정규 표현식의 끝을 표시
*/

 

 

🧷 split ()

✔️String[] split (CharSequence input[, int limit])

 

split method는 input에 해당하는 문자열을 기준으로 데이터를 잘라줍니다.

아래의 예시를 보겠습니다.

 

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

public class regex {
    static public void main(String[] args) {
        String REGEX = ":";
        String INPUT = "boo:and:foo::";

        Pattern pattern = Pattern.compile(REGEX);
        String[] result = pattern.split(INPUT);
        
        System.out.println(Arrays.toString(result));  // [boo, and, foo]
    }
}

 

":"을 기준으로 데이터를 잘라서 배열에 담은 것을 확인할 수 있습니다.

이 때, 데이터가 없다면 배열에 담지 않는 것도 확인하셨나요❓ 

 

만약, 그것까지 포함하고 싶다면 두 번째인자인 limit을 활용하면 됩니다.

limit은 split을 어느 범위까지 할 것인지를 결정해줍니다.

 

default는 0으로 위의 출력과 동일하죠.

 

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class regex {
    static public void main(String[] args) {
        String REGEX = ":";
        String INPUT = "boo:and:foo::";

        Pattern pattern = Pattern.compile(REGEX);

        String[] result1 = pattern.split(INPUT, 0);    // limit이 0일때
        System.out.println(Arrays.toString(result1));  // [boo, and, foo]

        String[] result2 = pattern.split(INPUT, 2);    // limit이 양수일때
        System.out.println(Arrays.toString(result2));  // [boo, and:foo::]

        String[] result3 = pattern.split(INPUT, -1);   // limit이 음수일때
        System.out.println(Arrays.toString(result3));  // [boo, and, foo, , ]

    }
}

 

양수일 때에는 limit 번째부터 split을 하지 않으며, 음수일 때에는 공백 또한 데이터에 포함합니다.

 

 

🧷 toString ()

✔️ public String toString ()

 

pattern 객체를 String으로 변환하여 반환해줍니다.

 

 

'Spring > Java' 카테고리의 다른 글

Masking Name with Regex, in java  (0) 2022.05.29
Java Date & Time, 제대로 사용하기  (2) 2022.05.22
ENUM, Clean Code with Java  (0) 2022.05.11
Matcher, 어렵지 않게 사용하기  (2) 2020.08.24
HashMap, 어렵지 않게 사용하기  (3) 2020.07.06