학원/JAVA

9.29 12 -1 정규표현식

도원결의 2022. 9. 29. 18:42

RegularExpression

[정규표현식] : 특정 패턴을 갖는지 검사하기 위해 사용하는 형식 언어

일정 패턴이 있다면 그 패턴을 가지고 긴 문자열을 분리해서 활용할 수 있으니 나름 유용한 놈이긴한 것 같지만 잘 모르겠다.... 이건 일전에 좋은 기업에서 문제로 나왔다고 하니 배워놓는걸로

정규표현식을 다 외우는건 불가능 하나 자주 쓰이는 놈들은 알아두면 쓰기엔 편하겠지 표현문자는 첨부파일에 첨부해놓고 필요할 때마다 보자(선생님 자료주셔서 감사합니다 ㅎㅎ

 

자바정규표현식.txt
0.00MB

활용을 어찌하는지 보자

[이메일 형식의 "패턴문장열" 만들기 ]

   이메일 주소는 알파벳으로 시작하고(숫자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

 

 

*** 입사문제에 나왔다면 엄청난 시간 노력이 필요한 작업인것을    ...... 느꼈다..... 끝