프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어를 말한다. 정규식이라고도 부르며,보통 regex 혹은 regexp라 많이 쓴다. - 나무위키
어플리케이션에서 보통 이용자가 데이터를 입력할 때 제대로 된 값을 입력했는지 검증하는 용도로 쓰인다.
이메일 형식, 전화번호, 비밀번호 형식 등등 데이터베이스에 쌓는 자료가 의미있고 일관성이 있게 프로그래밍을 해야한다.
자주 사용하는 정규 표현식
- 숫자 : ^[0-9]*$
- 영문 대소문자 : ^[a-zA-Z]*$
- 한글 : ^[가-힣]*$
- 이메일 : ^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
- 전화번호 : ^\d{2,3}-\d{3,4}-\d{4}$
자바에서 정규표현식을 사용할 때 주로 사용하는 API는 java.util.regex 패키지 안에 Pattern 클래스와 Matcher 클래스를 주로 사용한다.
Pattern 클래스의 matches 메서드
정규 표현식에 대상 문자열을 검증하는 기능은 java.util.rege.Pattern 클래스의 matches()메소드를 활용하여 검증할 수 있습니다. matches() 메서드의 첫번째 매개값은 정규표현식이고 두번째 매개값은 검증 대상 문자열입니다. 검증 후 대상문자열이 정규표현식과 일치하면 true, 그렇지 않다면 false값을 리턴합니다.
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String pattern = "^[0-9]*$"; //숫자만
String val = "123456789"; //대상문자열
boolean regex = Pattern.matches(pattern, val);
System.out.println(regex);
}
}
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 클래스의 find메서드
Matcher 클래스는 대상 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 판별할 때 주로 사용됩니다. Matcher 클래스의 입력값으로는 CharSequence라는 새로운 인터페이스가 사용되는데 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있습니다. Matcher객체는 Pattern객체의 matcher() 메소드를 호출하여 받아올 수 있습니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("^[a-zA-Z]*$"); //영문자만
String val = "abcdef"; //대상문자열
Matcher matcher = pattern.matcher(val);
System.out.println(matcher.find());
}
}
Matcher 클래스 주요 메서드
matches() : 대상 문자열과 패턴이 일치할 경우 true 반환합니다.
find() : 대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동합니다.
find(int start) : start위치 이후부터 매칭검색을 수행합니다.
start() : 매칭되는 문자열 시작위치 반환합니다.
start(int group) : 지정된 그룹이 매칭되는 시작위치 반환합니다.
end() : 매칭되는 문자열 끝 다음 문자위치 반환합니다.
end(int group) : 지정되 그룹이 매칭되는 끝 다음 문자위치 반환합니다.
group() : 매칭된 부분을 반환합니다.
group(int group) : 매칭된 부분중 group번 그룹핑 매칭부분 반환합니다.
groupCount() : 패턴내 그룹핑한(괄호지정) 전체 갯수를 반환합니다.
String 클래스의 matches 메서드
import java.util.regex.Pattern;
public class RegexExample {
// 같은 정규표현식 검사를 여러번 한다면 Pattern 인스턴스를 캐싱해두고
// isRomanNumeral 메서드를 재사용 한다.
private static final Pattern ROMAN = Pattern.compile("^(?=.)M*(C[MD]|D?C{0,3})"
+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
static boolean isRomanNumeral(String s ) {
return ROMAN.matcher(s).matches();
}
public static void main(String[] args) {
boolean test = isRomanNumeral("MCMLXXVI"); // true
System.out.println(test);
}// end of main
}
유효성 검사
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String name = "홍길동";
String tel = "010-1234-5678";
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("^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", email);
//출력
System.out.println("이름 : " + name_check); // 이름 : true
System.out.println("전화번호 : " + tel_check); // 전화번호 : true
System.out.println("이메일 : " + email_check); // 이메일 : true
}
}
-정규표현식 문법
https://hamait.tistory.com/342
-정규표현식 참고
https://coding-factory.tistory.com/529
https://yoonhoou.tistory.com/19
-정규표현식 검사 사이트
'Effective Java > 키워드' 카테고리의 다른 글
브리지 패턴 (Bridge Pattern) (0) | 2023.01.07 |
---|---|
오토박싱 오토언박싱 (AutoBoxing AutoUnBoxing) (0) | 2023.01.06 |
의존 객체 주입 패턴 (Dependency Injection Pattern) (0) | 2023.01.06 |
정적 유틸리티 클래스 (Static Utility Class) (0) | 2023.01.06 |
직렬화 역직렬화 (Siriallizable Desirializable) (0) | 2023.01.04 |