일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 이클립스
- 예외처리
- 스프링 mvc프로젝트가 안뜰때
- source root
- 설치에러
- 인텔리제이
- 자바클래스가 안보일때
- mark directory as
- arrays메서드
- mvc project 생성
- POST요청
- 소스루트설정
- printStackTrace()
- throw e
- 파일을 읽을 수 없을때
- 색상에 따른 상태
- 멀티 catch 블럭
- getMessage()
- unchecked예외
- 예외발생
- 예외 발생
- 빨간파일
- 포트충돌
- checked예외
- chained exception
- 깃베쉬
- exception re-throwing
- 인텔리제이물음표파일
- 빨간폴더
- 사용자 정의 예외
- Today
- Total
프로그래밍 스티치
자바 정규 표현식 (Pattern, Matcher) 사용법&예제 본문
정규표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어입니다. 개발을 하다보면 특정한 형식, 예를 들어 전화번호, 주민등록번호, 이메일등과 같이 정해진 형식이 있고 사용자가 그 형식대로 제대로 입력했는지 검증을 해야하는 경우가 종종 있습니다. 이런 입력값을 정해진 형식에 맞는지 검증해야 할 때에는 정규표현식을 사용합니다.
위와 같은 문법들을 사용해서 정해진 형식을 만들어 사용합니다. 하지만 우리는 주로 사용하는 형식이 정해져 있기에 미리 만들어 놓은 형식을 이용하는것이 편합니다!
자주 사용하는 정규 표현식!
정규표현식 | 설명 |
^[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}$ | 우편번호 |
위와같은 식들이 주로 사용하는 정규 표현식 입니다. 일일이 외워놓고 만들기 보다는, 그때그때 필요할때마다 사용하는것이 더 시간을 효율적으로 사용할 수 있는 방법이라 생각됩니다.
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 |
---|