9.29 12 -1 정규표현식
RegularExpression
[정규표현식] : 특정 패턴을 갖는지 검사하기 위해 사용하는 형식 언어
일정 패턴이 있다면 그 패턴을 가지고 긴 문자열을 분리해서 활용할 수 있으니 나름 유용한 놈이긴한 것 같지만 잘 모르겠다.... 이건 일전에 좋은 기업에서 문제로 나왔다고 하니 배워놓는걸로
정규표현식을 다 외우는건 불가능 하나 자주 쓰이는 놈들은 알아두면 쓰기엔 편하겠지 표현문자는 첨부파일에 첨부해놓고 필요할 때마다 보자(선생님 자료주셔서 감사합니다 ㅎㅎ
활용을 어찌하는지 보자
[이메일 형식의 "패턴문장열" 만들기 ]
이메일 주소는 알파벳으로 시작하고(숫자x) @와 .이 반드시 들어가 있어야 한다.
패턴문자열 : String regex="[a-zA-Z]+@[A-Za-z0-9]+\\.[A-Za-z0-9]+";
1 Pattern.compile("패턴문자열") 패턴객체 생성하기
Pattern pattern = Pattern.compile(regex);
.pattern( ) : 패턴 문자열 반환하기
System.out.println(pattern.pattern());
Scanner sc = new Scanner(System.in);
System.out.println("이메일을 입력하세요?"); => 사용자에게 이메일 입력받고
String email = sc.nextLine(); =>입력받은 메일 String형으로 저장
2. Matcher객체 생성 : Matcher Pattern객체.matcher("패턴과 일치하는지 검증할 대상 문자열")
Match matcher = pattern.matcher(email);
[Matcher객체의 주요 메소드]
1) .matches():대상 문자열과 패턴이 일치할 경우 true 반환
System.out.println(matcher.matches()?"이메일 형식이다":"이메일 형식이 아니다");
2) .start() : 매칭되는 문자열 시작 위치 반환.
3) .end() : 매칭되는 문자열 끝 다음 문자 위치 반환 ==> 2),3)은 매칭이 된 경우에만 호출해야 정확하게 반환할 수 있음!!! 1)에서 true 안나오면 밑에꺼까지 출력 안됨
if(matcher.matches()) {
System.out.println("패턴이 일치하는 문자열의 시작 위치:"+matcher.start());
System.out.println("패턴이 일치하는 문자열의 끝 위치:"+matcher.end());
}
그룹관련 함수들
(실제나왔던문제중하나) String value="[17.07.11 23:29:11] [INFO ] [eclipse.galileo-bean-thread-50618297 galileo.site.SiteBean:317 ] - ##galileo_bean end. MessageExchange_ID:ID:localhost-15a6308ba1c-6:86071562";
방법1:\d 사용
pattern=Pattern.compile("\\[(\\d{2}\\.\\d{2}\\.\\d{2}\\s\\d{2}:\\d{2}:\\d{2})\\]\\s\\[(.+)\\]\\s{2}\\[(.+)\\]\\s-\\s(.+)");
방법2:[0-9]사용
pattern=Pattern.compile("\\[([0-9]{2}\\.[0-9]{2}\\.[0-9]{2}\\s[0-9]{2}:[0-9]{2}:[0-9]{2})\\]\\s\\[(.+)\\]\\s{2}\\[(.+)\\]\\s-\\s(.+)");
방법3:러프하게
pattern=Pattern.compile("\\[(.+)\\] \\[(.+)\\] \\[(.+)\\] - (.+)");
matcher = pattern.matcher(value);
System.out.println("패턴 일치 여부:"+matcher.matches());
4).groupCount() : 전체 괄호"()" 개수을 반환. 이건 패턴이 일치 안해도 됨!
System.out.println("그룹수:"+matcher.groupCount());
5) group() :항상 패턴이 일치하는지 판단후 matcher.group(그룹번호)사용,
group(0)번은 전체 대상문자열 구분 안하고 걍 통째로 묶은거
if(matcher.matches( )) {
for(int i=1;i <= matcher.groupCount();i++)
System.out.printf("그룹 %d번:%s%n",i,matcher.group(i));
}
=>이건 출력 함 봐야지 요렇게 쪼개진당
그룹 1번:17.07.11 23:29:11
그룹 2번:INFO
그룹 3번:eclipse.galileo-bean-thread-50618297 galileo.site.SiteBean:317
그룹 4번:##galileo_bean end. MessageExchange_ID:ID:localhost-15a6308ba1c-6:86071562
예제 & 간단하게 이해하기
value="00000 000% 1. Before Marshalling"; =>요놈 패턴에 맞게 쪼개는게 목표
pattern=Pattern.compile("([0-9]{5})\\s{2}(\\d{3}%)\\s{2}(.+)"); => 패턴 만들기
matcher = pattern.matcher(value); =>matcher 형식으로 생성해서 일치여부 판단
System.out.println("패턴 일치 여부:"+matcher.matches());
if(matcher.matches()) {
for(int i=1;i <= matcher.groupCount();i++)
System.out.printf("그룹 %d번:%s%n",i,matcher.group(i)); =>쪼갠거 출력!
}
==>출력
패턴 일치 여부:true
그룹 1번:00000
그룹 2번:000%
그룹 3번:1. Before Marshalling
*** 입사문제에 나왔다면 엄청난 시간 노력이 필요한 작업인것을 ...... 느꼈다..... 끝