프로그래밍 스티치

자바 정규 표현식 (Pattern, Matcher) 사용법&예제 본문

JAVA/java.lang패키지와 유용한클래스

자바 정규 표현식 (Pattern, Matcher) 사용법&예제

프로그래밍 스티치 2022. 2. 14. 17:45

정규표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어입니다. 개발을 하다보면 특정한 형식, 예를 들어 전화번호, 주민등록번호, 이메일등과 같이 정해진 형식이 있고 사용자가 그 형식대로 제대로 입력했는지 검증을 해야하는 경우가 종종 있습니다. 이런 입력값을 정해진 형식에 맞는지 검증해야 할 때에는 정규표현식을 사용합니다.

 

 

정규표현식 기본문법

위와 같은 문법들을 사용해서 정해진 형식을 만들어 사용합니다. 하지만 우리는 주로 사용하는 형식이 정해져 있기에 미리 만들어 놓은 형식을 이용하는것이 편합니다!

 

정규표현식 이메일 자세한 설명

 

자주 사용하는 정규 표현식!

정규표현식 설명
^[0-9]*$ 숫자
^[a-zA-Z]*$ 영문자
^[가-힣]*$ 한글
\\w+@\\w+\\.\\w+(\\.\\w+)? E-Mail
^\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}$ 우편번호

위와같은 식들이 주로 사용하는 정규 표현식 입니다. 일일이 외워놓고 만들기 보다는, 그때그때 필요할때마다 사용하는것이 더 시간을 효율적으로 사용할 수 있는 방법이라 생각됩니다.

 

 

Pattern 클래스

정규 표현식에 대상 문자열을 검증하는 기능은 java.util.rege.Pattern 클래스의 matches()메소드를 활용하여 검증할 수 있습니다. matches() 메서드의 첫번째 매개값은 정규표현식이고 두번째 매개값은 검증 대상 문자열입니다. 검증 후 대상문자열이 정규표현식과 일치하면 true, 그렇지 않다면 false값을 리턴합니다.

Matcher 클래스

Matcher 클래스는 대상 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 판별할 때 주로 사용됩니다. Matcher 클래스의 입력값으로는 CharSequence라는 새로운 인터페이스가 사용되는데 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있습니다. Matcher객체는 Pattern객체의 matcher() 메소드를 호출하여 받아올 수 있습니다. 

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 클래스 주요 메서드
matches() : 대상 문자열과 패턴이 일치할 경우 true 반환합니다.
find() : 대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동합니다.
find(int start) : start위치 이후부터 매칭검색을 수행합니다.
start() : 매칭되는 문자열 시작위치 반환합니다.
start(int group) : 지정된 그룹이 매칭되는 시작위치 반환합니다.
end() : 매칭되는  문자열 끝 다음 문자위치 반환합니다.
end(int group) : 지정되 그룹이 매칭되는 끝 다음 문자위치 반환합니다.
group() : 매칭된 부분을 반환합니다.
group(int group) : 매칭된 부분중 group번 그룹핑 매칭부분 반환합니다. 
groupCount() : 패턴내 그룹핑한(괄호지정) 전체 갯수를 반환합니다.

 

다음은 정규식과 Pattern, Matcher클래스를 사용한 예제입니다.

import java.util.*;
import java.util.regex.*;

class Exercise9_6 {
	public static void main(String[] args) {
		String[] phoneNumArr = {
				"012-3456-7890",
				"099-2456-7980",
				"088-2346-9870",
				"013-3456-7890"};
		
		Vector list = new Vector(); // 검색결과를 담을 Vector
		Scanner s = new Scanner(System.in);
		
		while(true) {
			System.out.print(">>");
			String input = s.nextLine().trim(); // trim()으로 입력내용에서 공백을 제거
			
			if(input.equals("")) {
				continue;
			} else if(input.equalsIgnoreCase("Q")) {
				System.exit(0);
			}

			String pattern = ".*"+input+".*"; // input을 포함하는 모든 문자열
			Pattern p = Pattern.compile(pattern);
			for(int i=0; i< phoneNumArr.length;i++) {
				String phoneNum = phoneNumArr[i];
				String tmp = phoneNum.replace("-",""); // phoneNum에서 '-'를 제거
				Matcher m = p.matcher(tmp);
				if(m.find()) { // 패턴과 일치하면, list에 phoneNum을 추가한다.
					list.add(phoneNum);
				}
			}
			
			if(list.size()>0) { // 검색결과가 있으면
				System.out.println(list); // 검색결과를 출력하고
				list.clear(); // 검색결과를 삭제
			} else {
				System.out.println("일치하는 번호가 없습니다.");
			}
		}
	} // main
}

패턴을 정의하였으니, 이제는 반복문으로 배열 phoneNumArr의 전화번호를 하나씩 읽어서
패턴과 일치하는지 확인한다. 이때 주의해야할 것은 사용자가 "234"를 입력했을 때
"012-3456-8790"과 "088-2346-9870"이 모두 검색될 수 있도록 전화번호에서 '-'를 제거한
후에 패턴과 일치하는지 확인해야한다는 것이다.

 

reference
https://coding-factory.tistory.com/529
https://hamait.tistory.com/342
자바의 정석 기초편 - 저자 남궁성
++ https://regexr.com/ ( 정규표현식 테스트 해볼수 있는 사이트 )

 

'JAVA > java.lang패키지와 유용한클래스' 카테고리의 다른 글

Object클래스  (0) 2022.02.14