자바 정규 표현 식 의 그룹 과 바 꾸 기

18763 단어 정규 표현 식
정규 표현 식 의 하위 표현 식 (그룹) 은 잘 모 르 지만 강력 한 텍스트 처리 도구 입 니 다.
1 정규 표현 식 몸 풀기
전화 번호
//       
//        13xxx 15xxx 18xxxx 17xxx
System.out.println("18304072984".matches("1[3578]\\d{9}"));   // true

//    :010-65784236,0316-3312617,022-12465647,03123312336
String regex = "0\\d{2}-?\\d{8}|0\\d{3}-?\\d{7}";
String telStr = "010-43367458";
System.out.println(telStr.matches(regex));  // true

일치 메 일 박스
String mail = "[email protected]";
String reg = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,2}";
System.out.println(mail.matches(reg));  // true

특수 문자 교체
중국어 가 아 닌 문 자 를 비 워 두 기:
String input = "    &*%$      @bdfbdbdfdgds23532";
String reg = "[^\\u4e00-\\u9fa5]";
input = input.replaceAll(reg, "");
System.out.println(input);   //           

한자 의 유 니 코드 인 코딩 범 위 는: \u4e00-\u9fa52 분조
그룹 은 괄호 로 구 분 된 정규 표현 식 으로 그룹의 번호 에 따라 그룹 을 참조 할 수 있 습 니 다.그룹 번 호 는 0 으로 전체 표현 식 을 나타 내 고 그룹 번호 1 은 첫 번 째 괄호 가 확 대 된 그룹 을 나타 내 며 이 를 유추 합 니 다.Java API 에서 Pattern 의 설명 을 보십시오: Capturing groups are numbered by counting their opening parentheses from left to right. expression ((A)(B(C))), for example, there are four such groups:
1. ((A)(B(C)))
2. (A)
3. (B(C))
4. (C)

그 다음 에 A(B(C))D 세 개의 그룹 이 있 습 니 다. 그룹 0 은 ABC 이 고 그룹 1 은 BC 이 며 그룹 2 는 C 입 니 다. 몇 개의 왼쪽 괄호 가 있 는 지 에 따라 몇 개의 그룹 이 있 는 지 확인 할 수 있 습 니 다. 괄호 안의 표현 식 은 모두 하위 표현 식 이 라 고 부 릅 니 다.
Eg1:
Matcher 대상 은 여러 가지 방법 을 제공 합 니 다.
  • goupCount() 이 정규 표현 식 모드 의 그룹 수 를 되 돌려 줍 니 다. '왼쪽 괄호' 의 수
  • 에 대응 합 니 다.
  • group(int i) 대응 하 는 그룹의 일치 문 자 를 되 돌려 주 고 일치 하지 않 으 면 null
  • 을 되 돌려 줍 니 다.
  • start(int group) 대응 하 는 그룹의 일치 하 는 문자 의 시작 색인
  • 을 되 돌려 줍 니 다.
  • end(int group) 대응 하 는 그룹의 일치 하 는 문자 의 마지막 문자 색인 에 1 의 값 을 되 돌려 줍 니 다
  • //            ,
    // group(0)   \\$\\{([^{}]+?)\\}
    // group(1)   ([^{}]+?)
    String regex = "\\$\\{([^{}]+?)\\}";
    Pattern pattern = Pattern.compile(regex);
    String input = "${name}-babalala-${age}-${address}";
    
    Matcher matcher = pattern.matcher(input);
    System.out.println(matcher.groupCount());
    // find()                
    while (matcher.find()) {
        System.out.println(matcher.group(0) + ", pos: "
                + matcher.start() + "-" + (matcher.end() - 1));
        System.out.println(matcher.group(1) + ", pos: " +
                matcher.start(1) + "-" + (matcher.end(1) - 1));
    }
    

    출력:
    1
    ${name}, pos: 0-6
    name, pos: 2-5
    ${age}, pos: 17-22
    age, pos: 19-21
    ${address}, pos: 24-33
    address, pos: 26-32
    
    group 중국어 로 번역 하면 팀 을 나 누 는 것 입 니 다.group() 또는 group(0) 전체 정규 표현 식 이 매번 일치 하 는 내용 에 대응 합 니 다. group(1) 괄호 안에 (하위 표현 식 그룹) 일치 하 는 내용 을 표시 합 니 다.
    Eg2:
    그룹 을 보다 직관 적 으로 보기 위해 Eg 1 의 정규 표현 식 에 괄호 를 하나 더 추가 합 니 다.
    String regex = "(\\$\\{([^{}]+?)\\})";
    Pattern pattern = Pattern.compile(regex);
    String input = "${name}-babalala-${age}-${address}";
    
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        System.out.println(matcher.group(0) + ", pos: " + matcher.start());
        System.out.println(matcher.group(1) + ", pos: " + matcher.start(1));
        System.out.println(matcher.group(2) + ", pos: " + matcher.start(2));
    }
    

    출력:
    ${name}, pos: 0
    ${name}, pos: 0
    name, pos: 2
    ${age}, pos: 17
    ${age}, pos: 17
    age, pos: 19
    ${address}, pos: 24
    ${address}, pos: 24
    address, pos: 26
    

    이 를 통 해 한 쌍 의 괄호 와 한 팀 을 나 눌 수 있 고 왼쪽 괄호 수 를 통 해 몇 개의 그룹 이 있 는 지 확인 할 수 있다.group() 을 통 해 그룹 에 있 는 일치 하 는 문자열 을 얻 는 응용 장면 이 매우 광범 위 하 다. 필자 의 한 프로젝트 에서 이 특성 을 사용 하여 재 미 있 는 마스크 교 체 를 실현 했다. 감동!
    3. 그룹 교체
    Eg1:
    String tel = "18304072984";
    //      ,      $n   n    
    tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    System.out.print(tel);   // output: 183****2984
    

    replace All 은 문자열 을 바 꾸 는 방법 입 니 다. 정규 표현 식 에서 괄호 는 그룹 을 표시 합 니 다. replace All 의 매개 변수 2 에 서 는 $n (n 은 숫자) 을 사용 하여 하위 표현 식 에 일치 하 는 그룹 문자열 을 순서대로 참조 할 수 있 습 니 다. "(\\d{3})\\d{4}(\\d{4})", "$1****$2" 는 앞 ( ) ( ) 으로 나 뉘 어 ( $1)( * )( $2) 로 바 꿀 수 있 습 니 다.
    Eg2:
    String one = "hello girl hi hot".replaceFirst("(\\w+)\\s+(\\w+)", "$2 $1"); 
    String two = "hello girl hi hot".replaceAll("(\\w+)\\s+(\\w+)", "$2 $1"); 
    System.out.println(one);   // girl hello hi hot
    System.out.println(two);   // girl hello hot hi
    

    Eg 1 을 이해 하면 이 예 도 자연히 이해 할 수 있다.
    Eg3:
    실 용적 인 예 를 들 어 문장 부호 의 교 체 를 반복 합 니 다.
    String input = "        ,,,   ,,,         !!!…………";
    
    //         
    String duplicateSymbolReg = "([。?!?!,]|\\.\\.\\.|……)+";
    input = input.replaceAll(duplicateSymbolReg, "$1");
    System.out.println(input);
    

    출력:
            ,   ,         !……
    

    정규 표현 식: ([。?!?!,]|\\.\\.\\.|……)+ 괄호 는 하나의 그룹 입 니 다. 하나의 문장 부 호 를 표시 합 니 다. + 이 그룹 에 한 번 또는 여러 번 나타 나 는 것 을 표시 합 니 다. $1 그룹의 내용 (하나의 문장 부호) 을 표시 합 니 다.replace All 은 문자열 을 바 꾸 기 위해 $1 를 사용 합 니 다.
    Eg4:
    IP 주소 정렬
    String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
    ip = ip.replaceAll("(\\d+)", "00$1");
    System.out.println(ip);
    
    ip = ip.replaceAll("0*(\\d{3})", "$1");
    System.out.println(ip);
    String[] strs = ip.split(" ");
    
    Arrays.sort(strs);
    for (String str : strs) {
        str = str.replaceAll("0*(\\d+)", "$1");
        System.out.println(str);
    }
    

    출력:
    00192.0068.001.00254 00102.0049.0023.00013 0010.0010.0010.0010 002.002.002.002 008.00109.0090.0030
    192.068.001.254 102.049.023.013 010.010.010.010 002.002.002.002 008.109.090.030
    2.2.2.2
    8.109.90.30
    10.10.10.10
    102.49.23.13
    192.68.1.254
    
  • IP 주소 의 단락 마다 3 자리, 교체 후 4 자리 가 있 는 경우
  • IP 주소 의 단락 당 3 자리
  • 보장
  • 정렬 의
  • 여기까지 쓰 고 나 니 필 자 는 감탄 을 금치 못 했다. 정말 강하 다!
    4 역방향 참조
    작은 괄호 로 하위 표현 식 을 묶 으 면 이 하위 표현 식 과 일치 하 는 텍스트 는 표현 식 이나 다른 프로그램 에서 더 많은 처 리 를 할 수 있 습 니 다.기본 적 인 상황 에서 각 그룹 은 자동 으로 하나의 그룹 번 호 를 가지 게 됩 니 다. 규칙 은 그룹의 왼쪽 괄호 를 표지 로 하고 왼쪽 에서 오른쪽으로 첫 번 째 그룹의 그룹 번 호 는 1 이 고 두 번 째 는 2 로 유추 합 니 다.
    Eg:
    /*                      */
    String regex = "(.)\\1(.)\\2";  
    System.out.println("    ".matches(regex));   // true
    System.out.println("    ".matches(regex));   // false
    

    (.) 는 하나의 그룹 을 나타 내 고 안 . 은 임 의 문 자 를 나타 내 며 모든 문 자 는 하나의 그룹 으로 나 뉘 었 다. \\1 은 그룹 1 이 또 한 번 나 타 났 고 \\2 은 그룹 2 가 또 한 번 나 타 났 다.
    그 일치 는 정규 표현 식 을 어떻게 씁 니까?위의 예 에 따 르 면 을 한 조로 나 눈 다음 에 이 조 가 다시 나 타 났 다. 바로 이다.
    String regex = "(..)\\1";  
    System.out.println("    ".matches(regex));   // true
    System.out.println("    ".matches(regex));   // false
    

    5 역방향 참조 교체
    Eg1:
    String str = "  ...  ...  ..  ...  ...     ....    ...      ...     .. . ... ...  !!!";
            
    /*  .   */
    str = str.replaceAll("\\.+", "");
    System.out.println(str);
    
    str = str.replaceAll("(.)\\1+", "$1");
    System.out.println(str);
    

    출력:
                                       !!!
            !
    
    (.) 모든 문자 가 하나의 그룹 이 된다 는 것 을 나타 낸다.\\1+ 그룹 (한 글자) 을 참조 하여 이 그룹 이 한 번 또는 여러 번 나타 나 는 것 을 나타 낸다.$1 참조 그룹 (.) 은 여러 개의 중복 문 자 를 하나의 문자 로 바 꿉 니 다.
    Eg2:
    반복 되 는 두 자릿수 사이 의 내용 바 꾸 기:
    "xx12abdd12345".replaceAll("(\\d{2}).+?\\1", "");  //    xx345
    

    신기 하 죠?replace 시 리 즈 를 사용 하 는 방법 에 주의해 야 할 이상: 자바 replace All () 방법 오류 보고 Illegal group reference 참고: 자바 정규 편 - 27 - 정규 교체 와 그룹 기능 정규 표현 식 30 분 입문 튜 토리 얼 정규 기초 - 캡 처 그룹 (capture group)자바 정규 표현 식 Pattern 과 Matcher 류 자바 학습 의 정규 표현 식 자바 진급 - 정규 표현 식 검색 을 사용 하여 String 의 특정 문자 와 정규 표현 식 에 관 한 모든 자바 의 빈 칸, 구두점 기 호 를 제거 합 니 다.

    좋은 웹페이지 즐겨찾기