JAVA를 할 일이.. 생길지도..? 모르지만 어쨋든 오늘 나에게 큰 숙제를 남겨준 정규식 성능에 대해 알아보자.
예를 들어 +82-10-9999-9999 라는 전화번호가 있다고 하자.
그리고 해당 전화번호가 +XX-XX-XXXX-XXXX (X는 숫자) 의 형식에 맞는지 확인하고 싶다면 아래의 코드를 사용하면 된다.
boolean right = phone_number.matches("\\+\\d{2}-\\d{2}-\\d{4}-\\d{4}");
동일하게 +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();
는... 없는 것이다. 왜냐하면 String.matches의 내부에는 이미 Pattern.matcher로 구성되어 있기 때문이다.
그럼 성능의 차이는 없다고 봐야할까? 성능을 개선하기 위해서는 어떤 것이 필요할까?
결론부터 말하자면 무조건 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}");
?