본문 바로가기
Java

Pattern, Matcher를 matches()를 이용한 간단한 정규표현식 대조 (Java 11)

by latissimus 2022. 3. 27.

시작

맨날 Pattern을 사용할때마다 까먹고 다시 찾아보는 것 같다. 넥스트 스텝 미션을 하면서 Pattern과 Matcher를 사용할 일이 생겼는데, 이참에 정리해봐야겠다. 

 

우선 정규표현식과 대조하는 기능을 간단히 알아보고, 다음에 다른 메서드들도 정리할 생각이다.

1. Pattern이란?

자바 11 공식문서이다. Pattern에 대해 "정규표현식의 컴파일된 표현"이라고 한다. 간단히 말해서 정규표현식을 사용하고 싶은데, 문자열 그대로 사용할 수 없기때문에, Pattern의 compile메서드를 사용하여 Pattern객체로 만들어서 사용해야 한다.

 

재사용과 일회성이라고 적어놨는데, 밑에서 알아보자.

 

2. 간단한 사용법

1) Matcher의 matches() 활용

처음 캡쳐본에 빨간색 네모 부분의 코드

// 1. 정규표현식을 사용하기 위해 Pattern 객체 생성
Pattern p = Pattern.complie("a*b");

// 2. matcher메서드로 정규표현식을 사용가능한 Matcher 반환
Matcher m = p.matcher("aaaaab");

// 3. Matcher클래스의 matches로 패턴에 있던 정규표현식과, matcher의 인수로 받은 내용을 대조
boolean b = m.matches();

 

Pattern 클래스의 메서드 목록 중 일부

 

  1. 코드에서 문자열 형식으로 주어진 정규표현식을 complie("a*b") 해서 패턴객체로 만들었다. 레퍼런스에 보이듯이 compilestatic메서드이기 때문에 클래스명.compile("a*b"); 와 같이 바로 사용할 수 있다.
  2. 생성된 Pattern 객체matcher()메서드를 사용하여, Matcher 객체를 반환하였다.
  3. 마지막으로 Matcher의 matches()메서드를 사용하면, 저장되어있는 정규표현식과 문자열을 대조하여 일치 여부에 따라 boolean값을 반환한다.

정규표현식과 함께 패턴 객체 생성 -> 생성된 패턴 객체의 matcher()메서드로 Matcher 생성 -> Matcher의 maches()로 대조해서 T/F 반환

 

//코드 길이를 줄이고 싶을 떄
Matcher m = Pattern.complie("a*b").matcher("aaaaab");
boolean b = m.matches;

 

3줄이 길어서 줄이고 싶다면, 이와 같이도 사용할 수 있다.

 

 

그런데 분명 Matcher의 matches를 사용했는데, 이상하게 Pattern 클래스에도 matches가 있다. 왜 또 있을까?

Pattern클래스 메서드 요약

 

2) Pattern의 matches() 활용

//Pattern에서 바로 matches
boolean b = Pattern.matches("a*b", "aaaaab");

 

Pattern에도 matches() 메서드가 있다. 예전에 이것때문에 사용할때마다 자주 헷갈렸다. 첫 인수로 정규표현식, 두번째 인수에 문자열을 넣어서 바로 대조하면 바로 boolean값이 반환된다.

 

아까 3줄이었던 것과 같은 기능을 한다. 훨씬 간편하고, 이해하기도 쉬운 대신에 일회성이다. 이미 Matcher 객체에 matches()가 있지만, 편리함을 목적으로 바로 사용하기 위해 Pattern에도 matches()를 사용한다.

 

결국에는 간결하고 빠르게 사용할 수 있지만, 생성된 Pattern 객체 자체가 없어서 재사용이 불가능하다.

 

Pattern p = Pattern.complie("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
.
.
.
// Pattern p 재사용
Matcher m2 = p.matcher("aab");
boolean b2 = m.matches();

 

반대로, 아까 세줄 코드를 다시보면, 생성했던 Pattern객체를 위와같이 재사용할 수 있다는 장점이 있다.

 

 

정리

Pattern.matches 사용

  • 문자열과 정규표현식 비교를 한 줄로 해결
  • 간결하고 객체를 생성할 필요도 없으며, 한 눈에 들어옴
  • 일회성이라는 단점

Pattern 객체 생성 후, Matcher.matches 사용

  • 문자열과 정규표현식 비교를 위해 3줄을 써야함
  • Pattern 객체가 필요
  • 재사용 가능하다는 장점

 

 

추가

escape 문자

  • complie 메서드에 정규표현식 내용을 넣을때, 백슬래시는 escape 문자이다. 결론부터 말하자면, 문자열에 '\' 자체를 표현하고 싶으면 '\\'를 사용해야 하며, 정규표현식에 '\' 한 개를 표현하고 싶으면, '\\\\' 를 넣어야 한다.
  • 참고 : http://mwultong.blogspot.com/2006/12/java-backslash.html 

 

Pattern p = Pattern.complie("a*b");
p.matches("aaaaab");

위와 같이 컴파일하고 다음과 같이 재사용도 가능하다.

 

많이 부족합니다. 잘못된 부분 지적은 언제나 감사합니다.

 

 

 

댓글