안녕하세요.
개발을 할 때 전화번호, 이메일과 같은 형식을 검증해야 하는 경우가 있습니다.
사용자가 형식에 맞추어 입력을 했는지, 검증해야 하고 이 때 정규식(정규표현식)을 사용하면
쉽게 검증로직을 구현할 수 있습니다.
사실 정규식이라고 하면 뭔가 복잡해보이기도 하는데, 잘 알아두시고 참조하시면 쉽게 활용할 수 있습니다.
정규식 (정규표현식) 이란 ?
정규식은 정규표현식의 줄임말로 Regular Expression, 줄여서 regex, regexp라고도 합니다.
정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식언어입니다.
정규식은 언제사용하나요?
문자열에서 특정한 문자열을 찾아야 할 때, 정규식을 사용합니다.
예를 들어, 이메일의 형식을 체크하고 싶을 때 정규식을 사용한다면 쉽게 처리할 수 있습니다.
조금더 간결하게 사용할 수 있는거죠.
보통 아래의 정규표현식을 일반적으로 많이 사용하고, 이를 통해 검증로직을 구현합니다.
정규표현식 |
설명 |
^[0-9]*$ |
숫자 |
^[a-zA-Z]*$ |
영문 |
^[가-힣]*$ |
한글 |
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ |
핸드폰번호 |
^\d{2,3}-\d{3,4}-\d{4}$ |
전화번호 |
\\w+@\\w+\\.\\w+(\\.\\w+)? |
이메일 |
\d{6} \- [1-4]\d{6} |
주민번호 |
JAVA의 정규표현식 사용방법
JAVA 에서는 java.util.regex 를 사용해야 하며,
Pattern 객체, Matcher 객체가 있습니다.
Matcher객체는 Pattern 객체의 matcher 메소드를 호출해서 생성할 수 있습니다.
1. Pattern클래스
Pattern 클래스의 matches() 메소드를 통해 문자열을 검증할 수 있습니다.
matches의 첫번째 파라미터로 패턴 정규표현식을, 두번째 파라미터에는 검증을 하고자 하는 문자열을
넣으면 됩니다. 리턴은 boolean 이며, 일치할 경우 true 를 반환합니다.
import java.util.regex.Pattern;
public class RegexSample {
public static void main(String[] args) {
String pattern = "^[가-힣]*$"; //한글
String val = "가나다라마바사"; //대상문자열
boolean boolRegex = Pattern.matches(pattern, val);
System.out.println(boolRegex);
}
}
Pattern 클래스의 주요 메소드 compile(String regex) 주어진 정규표현식으로부터 패턴을 만드며, 컴파일이라고 합니다. matcher (CharSequence input) 입력된 문자열에서 패턴을 찾는 Matcher 객체를 만듭니다. pattern() 컴파일된 정규표현식을 String 형태로 반환합니다. split(CharSequence input) 주어진 입력 캐릭터 시퀀스를 패턴에 따라 분리합니다. matches (String regex, CharSequence input) 주어진 문자열이 규칙에 일치여부를 반환합니다. |
Pattern 의 주요 상수 값 Pattern.CASE_INSENSITIVE 대소문자를 구분하지 않습니다. Pattern.COMMENTS 패턴에 코멘트(comment)와 공백 문자를 허용합니다. Pattern.DOTALL Dotall 모드를 사용합니다. Pattern.MULTILINE 멀티라인 모드를 사용합니다. Pattern.UNIX_LINES 유닉스 라인 모드를 사용합니다. Pattern.CANON_EQ None표준화된 매칭 모드를 사용합니다. |
2. Matcher 클래스
Matcher 객체는 대상 문자열이 주어진 패턴과 일치하는가를 판단하는데 사용됩니다.
Matcher 클래스의 입력값으로는 CharSequence라는 새로운 인터페이스가 사용되는데
이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있습니다.
CharSequence 객체들에는 CharBuffer, String, StringBuffer 클래스가 있습니다.
Matcher 객체는 Pattern 객체의 matcher 메소드를 통해 받아올 수 있습니다.
Matcher 객체를 만들면,
특정 패턴과 일치하는지, 주어진 문자열이 특정 패턴으로 시작하는지,
대상 문자열에서 특정 패턴을 찾아내고, 새로운 문자열로 교체할 수 있습니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexSample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("^[가-힣]*$"); //한글
String val = "가나다라마바사"; //대상문자열
Matcher matcher = pattern.matcher(val);
System.out.println(matcher.find());
}
}
Matcher클래스 주요 메서드 matches() 대상이 되는 문자열이 패턴과 일치하는가를 판단합니다. lookingAt() 대상이 되는 문자열이 패턴으로 시작하는가를 판단합니다. find() 대상이 되는 문자열에서 패턴을 찾습니다. find(int start) Start 위치 이후부터 매칭 검사를 합니다. start() 매칭되는 문자열 시작 위치를 반환합니다. start(int group) 지정된 그룹이 매칭되는 시작 위치를 반환합니다. end() 매칭되는 문자열 끝 다음 문자 위치를 반환합니다. end(int group) 지정된 그룹이 매칭되는 끝 다음 문자 위치를 반환합니다. group() 매칭된 부분을 반환합니다. group(int group) 매칭된 부분 중 group 번 매칭 부분을 반환합니다. replaceAll(String replacement) 패턴과 일치되는 부분을 replacement로 대체합니다.
|
간단한 사용예제 - 유효성 검사
import java.util.regex.Pattern;
public class RegexSample {
public static void main(String[] args) {
//미리 준비한 패턴 정규표현식
String pattern1 = "^[가-힣]*$"; //한글
String pattern2 = "^01(?:0|1|[6-9])-(?:\\d{3}|\\d{4})-\\d{4}$"; //전화번호
String pattern3 = "\\w+@\\w+\\.\\w+(\\.\\w+)?"; //이메일
//검증에 필요한 문자열
String name = "홍길동";
String phone= "010-1234-5678";
String email = "test@test.com";
//정규표현식 검사
boolean name_check = Pattern.matches(pattern1 , name);
boolean tel_check = Pattern.matches(pattern2, tel);
boolean email_check = Pattern.matches(pattern3, email);
}
}
정규표현식 문법 - 각각의 의미
표현식 |
설명 |
^ |
문자열의 시작 |
$ |
문자열의 종료 |
. |
임의의 한 문자 (문자의 종류 가리지 않음) 단, \ 는 넣을 수 없음 |
* |
앞 문자가 없을 수도 무한정 많을 수도 있음 |
+ |
앞 문자가 하나 이상 |
? |
앞 문자가 없거나 하나있음 |
[] |
문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다. |
{} |
횟수 또는 범위를 나타낸다. |
() |
소괄호 안의 문자를 하나의 문자로 인식 |
| |
패턴 안에서 or 연산을 수행할 때 사용 |
\s | 공백 문자 |
\S | 공백 문자가 아닌 나머지 문자 |
\w |
알파벳이나 숫자 |
\W |
알파벳이나 숫자를 제외한 문자 |
\d |
숫자 [0-9]와 동일 |
\D |
숫자를 제외한 모든 문자 |
\ |
정규표현식 역슬래시(\)는 확장 문자 |
(?i) |
앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음 |
이상 자바의 정규표현식의 사용법과 활용예제였습니다.
♥공감과 댓글, 그리고 구독은 큰 힘이 됩니다.