정규 표현식(Reqular Expression)은 문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 검색하거나 치환하는 과정을 매우 간편하게 처리할 수 있도록 하는 수단이다.
이메일이나 전화번호 등 특정 문자열을 확인할 때 if문과 for문을 통해 지저분하게 처리하던 것을 정규 표현식을 활용하면 훨씬 간단하고 깔끔하게 처리할 수 있다.
Java에서는 util.regex 패키지에서 제공하는 Pattern과 Matcher 라이브러리를 사용하여 정규 표현식을 활용할 수 있다.
실제로 문자열 클래스인 String 클래스는 특정한 조건의 문자를 검색하거나 치환하는 메서드를 정규 표현식을 활용하여 구현하였다.
대표적으로 matches, replaceAll, replace, split 메서드들이 있다.
matches : 주어진 문자열에 매칭되는 값이 있는지 확인
replaceAll, replace : 주어진 문자열이 포함되는 모든 부분을 치환
replace와 replaceAll 메서드는 둘 다 주어진 문자열이 포함되는 모든 부분을 치환하는 메서드이지만 replace는 정규식을 인자 값으로 받고 replaceAll은 그냥 문자열을 인자 값으로 받는 차이가 존재한다.
이는 실제로 문자열을 치환할 때 정규식을 적용시켜주냐의 차이가 발생한다.
split : 주어진 문자열과 매치되는 문자열을 구분자로 자름
정규 표현식은 문법을 모른다면 이해하기도 어렵고 활용하기도 힘들지만 사용할 줄 안다면 굉장히 강력한 도구가 될 수 있다. 그렇다면 정규 표현식의 문법과 Pattern, Matcher 클래스를 활용하여 사용하는 방법에 대해서 알아보자.
먼저 정규 표현식 문법이다. 자주 사용하는 것들만 나타냈고 이외에도 다양한 문법이 존재한다.
위의 문법을 활용하면 다음과 같이 특정 문자열을 표현할 수 있다.
^[0-9]*$ : 숫자로만 구성된 문자열을 표현
^[0-9a-zA-Z]*$ : 숫자, 영소(대)문자로만 구성된 문자열을 표현
^[0-9a-zA-Z]+@[a-zA-Z]+\\.[a-zA-Z]+$ : Email을 표현
이번에는 Pattern과 Matcher를 활용하는 방법에 대해서 알아보자.
먼저 Pattern 클래스이다. 클래스명에서 알 수 있듯이 문자열을 검사할 패턴을 만들어내는 친구이다.
Pattern의 생성자는 private으로 선언되어 있기 때문에 new Pattern() 형식의 생성자로 생성할 수 없다.
Pattern 객체는 complie() 메서드를 통해 생성할 수 있다. compile() 메서드는 패턴으로 사용할 문자열만 인자로 생성하는 방법과 flags라는 인자를 하나 더 사용해서 만드는 2가지 방법이 존재한다.
String regex = "^[0-9]*$"; //숫자로만 이루어져 있는 패턴
Pattern pattern = new Pattern(regex) (x)
Pattern pattern = Pattern.complie(regex) (o)
flags는 패턴이 나중에 문자열을 처리하는 방법에 영향을 주는 친구로 다음과 같은 종류들이 존재한다.
String str = "abcABdCD"; //대소문자로 구성된 문자열
String regex = "^[a-z]*$"; //소문자로만 이루어진 패턴
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches()); => 대문자도 있기 때문에 false를 출력
---------------------------------------------------------------------
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); //int로 0x02(2)
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches()); => 대소문자를 무시하기 때문에 true를 출력
위의 방법을 보면 Matcher 객체를 사용하여 matches() 메서드로 검사하였지만 Matcher 객체 없이 Pattern 클래스에서 바로 matches() 메서드를 사용하여도 검사가 가능하다.
System.out.println(Pattern.matches(regex, str));
하지만 matches 메서드 내부를 보면 알겠지만 검사할 때마다 Pattern, Matcher 객체를 생성해야 하기 때문에 한번 사용할 것이 아니라면 Pattern의 matches() 메서드보단 Matcher 객체를 생성하여 Matcher의 matches() 메서드를 사용하는 것이 낫다.
다음으로 Matcher 클래스이다. Matcher 클래스명에서 알 수 있듯이 패턴을 활용하여 문자열을 처리하는 기능을 수행하는 친구이다.
Matcher 클래스의 입력값으로 CharSequenece라는 인터페이스가 사용되는데 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 사용할 수 있다.
기본적으로 제공되는 CharSequence 객체들은 CharBuffer, String, StringBuffer 클래스가 존재한다.
Matcher 클래스의 주요 메서드들은 다음과 같다.
정규 표현식, Pattern, Matcher 활용하여 email을 검사하는 메서드를 구현하였다. if문과 for문을 사용하여 복잡하게 구현했던 기능을 매우 간단하게 구현할 수 있다는 장점이 있다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String email1 = "abcde483@naver.com";
String email2 = "abcde483@navercom";
System.out.println("\"" + email1 + "\" is " + isEmail(email1));
System.out.println("\"" + email2 + "\" is " + isEmail(email2));
}
public static boolean isEmail(String email) {
//email을 표현하는 정규 표현식
//간단하게 영문자, 숫자 + @ + 영문자 + . + 영문자의 조합으로 구현
String regex = "^[0-9a-zA-Z]+@[a-zA-Z]+\\.[a-zA-Z]+$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(email);
return m.matches();
}
}
'IT 개인 공부 > Java' 카테고리의 다른 글
[Java] 접근 제한자 (0) | 2021.07.16 |
---|---|
[Java] 향상된 for 문 : for-each (0) | 2021.07.16 |
[Java] 참조 유형(Strong, Soft, Weak, Phantom) (0) | 2021.07.16 |
[Java] Optional : Null을 처리하는 방법 (0) | 2021.07.15 |
[Java] Scanner vs BufferedReader (0) | 2021.07.15 |
댓글