정규표현식(Regular Expression)이란 컴퓨터 과학의 정규언어로부터 유래한 것으로 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식 언어입니다. 개발을 하다보면 전화번호, 주민등록번호, 이메일 등과 같이 정해져있는 형식이 있고 사용자가 그 형식대로 제대로 입력했는지 검증해야 하는 경우가 종종 있습니다. 이런 입력값을 정해진 형식에 맞는지 검증해야 할 때에는 정규표현식을 쉽게 구현할 수 있습니다.
정규 표현식 | 설명 |
---|---|
^[0-9]*$ | 숫자 |
^[a-zA-Z]*$ | 영문자 |
^[가-힣]*$ | 한글 |
\\w+@\\w+\.\\w+{\\.\\w+}? | |
^\d{2,3}-\d{3,4}-\d{4}$ | 전화번호 |
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ | 휴대전화번호 |
\d{6} - [1-4]\d{6} | 주민등록번호 |
^\d{3}-\d{2}$ | 우편번호 |
정규 표현식에 대상 문자열을 검증하는 기능은 java.util.regex.Pattern 클래스의 mathches() 메소드를 활용하여 검증할 수 있습니다. matches() 메서드의 첫번째 매개값은 정규표현식이고 두번째 매개값은 검증 대상 문자열입니다. 검증 후 대상 문자열이 정규표현식과 일치하면 true, 그렇지 않다면 false를 리턴합니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternExample {
public static void main(String[] args) {
// 숫자만
String pattern = "^[0-9]*$";
// 대상 문자열
String val = "123456789";
// 대상 문자열과 패턴이 일치할 경우 true 반환
boolean regix = Pattern.matches(pattern, val);
System.out.println("regix: " + regix);
}
}
실행 결과: true
위 예제는 Pattern 클래스의 matches() 메서드를 활용하여 대상문자열이 숫자인지 아닌지 검증하는 예제입니다. 대상문자열이 숫자가 맞다면 true, 그렇지 않다면 false가 출력됩니다.
Pattern 클래스 주요 메서드
- compile(String regex) : 주어진 정규표현식으로부터 패턴을 만듭니다.
- matcher(CharSequence input) : 대상 문자열이 패턴과 일치할 경우 true를 반환합니다.
- asPredicate() : 문자열을 일치시키는 데 사용할 수있는 술어를 작성합니다.
- pattern() : 컴파일된 정규표현식을 String 형태로 반환합니다.
- split(CharSequence input) : 문자열을 주어진 인자값 CharSequence 패턴에 따라 분리합니다.
Parttern 플래그 값 사용(상수)
- Pattern.CANON_EQ : None표준화된 매칭 모드를 활성화합니다.
- Pattern.CASE_INSENSITIVE : 대소문자를 구분하지 않습니다.
- Pattern.COMMENTS : 공백과 #으로 시작하는 주석이 무시됩니다. (라인의 끝까지).
- Pattern.MULTILINE : 수식 ‘^’ 는 라인의 시작과, ‘$’ 는 라인의 끝과 match 됩니다.
- Pattern.DOTALL : 수식 ‘.’과 모든 문자와 match 되고 ‘\n’ 도 match 에 포함됩니다.
- Pattern.UNICODE_CASE : 유니코드를 기준으로 대소문자 구분 없이 match 시킵니다.
- Pattert.UNIX_LINES : 수식 ‘.’ 과 ‘^’ 및 ‘$’의 match시에 한 라인의 끝을 의미하는 ‘\n’만 인식됩니다.
Matcher 클래스는 대상 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 판별할 때 주로 사용됩니다. Matcher 클래스의 입력값으로 CharSequence라는 새로운 인터페이스가 사용되는데 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있습니다. Matcher 객체는 Pattern 객체의 matcher() 메소드를 호출하여 받아올 수 있습니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternExample {
public static void main(String[] args) {
// 주어진 정규표현식으로부터 패턴을 만듭니다.
Pattern pattern = Pattern.compile("^[a-zA-Z]*$");
// 컴파일된 정규표현식을 String 형태로 리턴
String result = pattern.pattern();
System.out.println(result);
String input = "abcdef";
Matcher matcher = pattern.matcher(input);
// 대상 문자열과 패턴이 일치할 경우, true 리턴 후 그 위치로 이동합니다.
System.out.println(matcher.find());
}
}
실행결과: true
정규 표현식은 유효성 검사 코드 작성 시 가장 효율적인 방법입니다.
import java.util.regex.Pattern;
public class RegixExample {
public static void main(String[] args) {
String name = "임준영";
String tel = "010-7900-1341";
String email = "test@naver.com";
// 유효성 검사
boolean name_check = Pattern.matches("^[가-힣]*$", name);
boolean tel_check = Pattern.matches("^01(?:0|1|[6-9])-(?:\\d{3}|\\d{4})-\\d{4}$", tel);
boolean email_check = Pattern.matches("\\w+@\\w.\\w+(\\.\\w+)?", email);
// 출력
System.out.println(name_check);
System.out.println(tel_check);
System.out.println(email_check);
}
}
실행결과
참조 사이트: https://coding-factory.tistory.com/529?category=758267, https://jamesdreaming.tistory.com/179