JAVA 정규식 성능에 대해 Pattern.matcher VS String.matches

구몽·2020년 1월 7일
2

JAVA를 할 일이.. 생길지도..? 모르지만 어쨋든 오늘 나에게 큰 숙제를 남겨준 정규식 성능에 대해 알아보자.

1.String.matches

예를 들어 +82-10-9999-9999 라는 전화번호가 있다고 하자.
그리고 해당 전화번호가 +XX-XX-XXXX-XXXX (X는 숫자) 의 형식에 맞는지 확인하고 싶다면 아래의 코드를 사용하면 된다.

boolean right = phone_number.matches("\\+\\d{2}-\\d{2}-\\d{4}-\\d{4}");

2.Pattern.matcher

동일하게 +82-10-9999-9999 라는 전화번호가 있고,
해당 전화번호가 +XX-XX-XXXX-XXXX (X는 숫자)의 형식에 맞는지 matcher로 확인해보자.

Pattern pattern = Pattern.compile("\\+\\d{2}-\\d{2}-\\d{4}-\\d{4}");
Matcher match = pattern.matcher(phone_number);
boolean right = match.matches();

3.Pattern.matcher 와 String.matches 의 차이

는... 없는 것이다. 왜냐하면 String.matches의 내부에는 이미 Pattern.matcher로 구성되어 있기 때문이다.

4. 성능 개선에 대해서

그럼 성능의 차이는 없다고 봐야할까? 성능을 개선하기 위해서는 어떤 것이 필요할까?

결론부터 말하자면 무조건 Pattern.matcher를 이용해야한다.
단순히 반복문에서의 Pattern.matcher와 String.matches는 차이가 없지만,
// 오답이랄까/ 아래의 코드와 같이 필요한 정규식 표현을 어플리케이션 시작 전에 compile 시켜놓고 재사용 해야한다.

static과 final을 잘 생각해서 사용합시다..;;

private static final Pattern pattern = Pattern.compile("\\d{3}-\\d{4}-\\d{4}");

--------------------- 아래 코드는 댓글에 주신 것 처럼 그닥.. 쓸모가 없습니다.-------------------------
중요한 것은 재사용 해야한다는 것.

private final Pattern pattern = Pattern.compile("\\d{3}-\\d{4}-\\d{4}");

3개의 댓글

comment-user-thumbnail
2023년 1월 29일

?

답글 달기