정규표현식이란?
- 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 언어! (Ex. 전화번호, 주민번호, 이메일 등등)
- 정해진 형식이 맞는 지 검증해야할 때 정규표현식 사용!
- boolean matches(String regex)
: 인자로 주어진 정규식에 매칭되는 값이 있는지 검사합니다.
- String replaceAll(String regex,String replacement)
: 문자열 내에 있는 정규식 regex와 매치되는 모든 문자열을 replacement문자열로 교체합니다.
- String[] split(String regex)
: 인자로 주어진 정규식과 매치되는 문자열을 구분자로 하여 분할합니다.
객체 | 설명 |
---|---|
Pattern 객체 | - 정규식의 컴파일된 표현이다. - Pattern 객체의 경우 공개된 생성자를 제공하지 않는다. - 패턴을 생성하려면 Pattern 객체를 반환하는 정적 compile 메소드를 호출해야한다. - 이 메소드는 첫 번쨰 인자로 정규식 문자열을 받아온다. |
Matcher 객체 | - 패턴을 해석하고 입력 문자열에 대해 일치 작업을 수행하는 객체 - Matcher도 공개된 생성자를 정의하고 있지 않는다. - Matcher 객체는 Pattern객체의 matcher메소드를 호출해서 얻는다. |
PatternSyntaxException 객체 | 정규식 패턴의 문법 오류를 나타내는 unchecked예외이다. |
import java.util.regex.Matcher; //패키지 import
import java.util.regex.Pattern;
public class PatternTest {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
Pattern pattern = Pattern.compile("<[^<>]*>"); //패턴 지정
Matcher matcher = pattern.matcher("배를 먹습니다. <br />사과를 먹습니다.");
boolean found = false;
while(matcher.find()) {
sb.append("텍스트 \"")
.append(matcher.group()) // 찾은 문자열 그룹.
.append("\"를 찾았습니다.\n")
.append("인덱스 ")
.append(matcher.start()) // 찾은 문자열의 시작 위치
.append("에서 시작하고, ")
.append(matcher.end()) // 찾은 문자열의 끝 위치
.append("에서 끝납니다.\n");
found = true;
}
if(!found) {
sb.append("찾지 못했습니다.");
}
System.out.println(sb.toString());
}
}
[결과]
텍스트 "<br />"를 찾았습니다.
인덱스 9에서 시작하고, 15에서 끝납니다.
Metacharacters는 Regex의 패턴에서 어떤 문자가 특별한 의미를 가지는 것을 말한다.
자주 사용되는 표현 | 설명 |
---|---|
. | 어떤 문자 1개를 의미 |
[abc] | a,b,c 중 하나이면 일치합니다. |
[^abc] | a,b,c를 제외한 다른 글자 이면 일치 |
[a-zA-z] | a부터 z까지 소문자 알파벳이거나 A부터 Z까지의 대문자 알파벳 중 하나라면 일치 |
[a-d[m-p]] | a부터 d까지, 또는 m부터 p까지 중에 하나이면 일치합니다. (합집합) |
[a-z&&[def]] | d,e,f중 하나이면 일치합니다. (교집합) |
[a-z &&[^m-p]] | m부터 p까지를 제외한, a부터 z중 하나이면 일치합니다. (차집합) |
1. 숫자 모양에 대한 형식 검사
"^[0-9]*$"
2. 영문으로만 구성되었는지에 대한 형식 검사
"^[a-zA-Z]*$"
3. 한글로만 구성되었는지에 대한 형식 검사
"^[ㄱ-ㅎ가-힣]*$"
4. 영문과 숫자로만 구성되었는지에 대한 형식 검사
"^[a-zA-Z0-9]*$"
5. 한글과 숫자로만 구성되었는지에 대한 형식 검사
"^[ㄱ-ㅎ가-힣0-9]*$"
6. 이메일 형식인지에 대한 검사. "아이디@도메인"의 형식을 충족해야 한다.
"[0-9a-zA-Z]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$"
7. "-"없이 핸드폰번호인지에 대한 형식검사.
"^01(?:0|1|[6-9])(?:\\d{3}|\\d{4})\\d{4}$"
8. "-"없이 전화번호인지에 대한 형식검사. 각 부분에 대한 자리수도 충족시켜야 한다.
"^\\d{2,3}\\d{3,4}\\d{4}$"
9. "-"없이 주민번호에 대한 글자수 및 뒷자리 첫글자가 1~4의 범위에 있는지에 대한 검사
"^\\d{6}[1-4]\\d{6}"
import java.util.regex.Pattern;
//이 패키지를 통해 정규 표현 검사 활용!
public class Test05 {
public static void main(String[] args) {
//회원 가입시에 입력한 내용들을 저장해보기!
String name = "홍길동";
String age = "20";
String email = "user@naver.com";
//이름이 한글인지 여부를 검사
boolean isKor = Pattern.matches("^[ㄱ-ㅎ가-힣]*$", name);
if(!isKor) { //한글이 아닌 경우
System.out.println("이름을 한글로 입력해 주세요");
return ; //
}
//나이가 숫자인지 검사
boolean isNum = Pattern.matches("^[0-9]*$",age);
if(!isNum){
System.out.println("나이는 숫자로 입력해 주세요");
return;
}
//이메일 형식인지 검사
boolean isemail = Pattern.matches("^[_a-zA-Z0-9-\\.]+@[\\.a-zA-Z0-9-]+\\.[a-zA-Z]+$",email);
if(!isemail){
System.out.println("이메일 형식이 잘못되었습니다.");
return;
}
}
}