[Java] Pattern, Matcher Class 정리

2022. 3. 24. 11:59Dev/Java

1. 정규 표현식(Regular expressions)

프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 형식 언어를 말한다. 정규식, regex, regexp라고도 많이 쓴다. 자바도  java.util.regex 패키지를 제공함으로써 개발자가 정규식을 사용할 수 있도록 한다. Pattern, Matcher 클래스는 그 패키지 내에 있는 클래스이다.

 

📌정규표현식 문법

^ 문자열의 시작 \B 단어가 아닌 것의 경계
$ 문자열의 끝 \A 입력의 시작부분
. 임의의 한 문자 \G 이전 매치의 끝
* 문자가 0번 이상 발생 \Z 입력의 끝이지만 종결자가 있는 경우
+ 문자가 1번 이상 발생 \z 입력의 끝
? 문자가 0번 혹은 1번 발생 \s 공백문자
[] 문자의 집합 범위를 나타냄
[0-9]: 숫자(0부터 9)
[a-z]: 알파벳(a부터 z)

앞에 ^가 나타나면 not을 의미
\S 공백문자가 아닌 나머지 문자
{} 횟수 또는 범위를 의미 \w 알파벳이나 숫자
() 소괄호 안의 문자를 하나의 문자로 인식 \W 알파벳이나 숫자를 제외한 문자
| or 조건 \d [0-9]와 동일
\ 확장 문자의 시작 \D 숫자를 제외한 모든 문자
\b 단어의 경계    

 

2. 클래스 정리

📌Pattern

정규 표현식이 컴파일된 클래스. 정규 표현식에 대상 문자열을 검증하거나, 활용하기 위해 사용되는 클래스이다.

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

 

📌Matcher

Pattern클래스를 받아 대상 문자열과 패턴이 일치하는 부분을 찾거나 전체 일치 여부등을 판별하기 위해 사용된다.

matches() 대상 문자열과 패턴이 일치하는 경우 true 반환
find() 대상 문자열과 패턴이 일치할 경우 true 반환, 그 위치로 이동
find(int start) start 인자로 받은 위치부터 매칭 체크
start() 매칭되는 문자열의 시작 위치를 반환
start(int group) 지정된 그룹이 매칭되는 시작위치 반환
end() 매칭되는 문자열의 끝 바로 다음 위치를 반환
end(int group) 지정된 그룹이 매칭되는 끝 바로 다음 문자 위치를 반환
group() 매칭된 부분 반환
group(int group) 매칭된 부분 중 group번째 그루핑 매칭부분을 반환
groupCount() 패턴 내 그룹핑한 전체 개수를 반환

 

📌사용 코드

public class AopMain {
    public static void main(String[] args) throws Exception{
        MyAdvice myAdvice = new MyAdvice();

        Class myClass = Class.forName("com.fastcampus.ch3.aop.MyClass");
        Object obj = myClass.newInstance();

        //myClass에 있는 메서드들을 배열로 얻어와서 하나씩 돌리는거
        for (Method m : myClass.getDeclaredMethods()) {
            myAdvice.invoke(m, obj, null);
        }
    }
}

class MyAdvice {
    Pattern p = Pattern.compile("a.*"); //a.*는 정규식으로 a로 시작하는 단어

    boolean matches(Method method) {
        Matcher matcher = p.matcher(method.getName());
        return matcher.matches();
    }

    void invoke(Method m, Object obj, Object... args) throws Exception {
        if (matches(m))
            System.out.println("[before]{");

        m.invoke(obj, args);    //aaa(), aaa2(), bbb() 호출가능

        if (matches(m))
            System.out.println("}[after]");
    }
}

class MyClass {
    void aaa() {
        System.out.println("aaa() is called.");
    }
    void aaa2() {
        System.out.println("aaa2() is called.");
    }
    void bbb() {
        System.out.println("bbb() is called.");
    }
}

📌결과

[before]{
aaa() is called.
}[after]
[before]{
aaa2() is called.
}[after]
bbb() is called.

📚 참고

나무위키 - 정규 표현식
https://hbase.tistory.com/160
https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html
fastcampus 강의 스프링의 정석