[Java] Pattern, Matcher Class 정리
2022. 3. 24. 11:59ㆍDev/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 강의 스프링의 정석