Java 정규(1)-패턴 상세 설명(1)

18520 단어 정규 표현 식
이 시리즈 의 문장 은 다음 과 같은 순서 로 설명 한다.
  • Pattern 상세 설명;
  • Matcher 상세 설명;
  • 정규 표현 식 문법 상세 설명.

  • 다음은 Pattern 종 류 를 소개 합 니 다.
    자바 에서 java.util.regex 패 키 지 는 정규 표현 식 이 사용 하 는 관련 류 를 정 의 했 는데 그 중에서 가장 중요 한 두 가지 유형 은 Pattern,Matcher 이다.
  • Pattern 정규 표현 식 을 컴 파일 한 후 일치 하 는 모드 를 만 듭 니 다.
  • MatcherPattern 인 스 턴 스 가 제공 하 는 정규 표현 식 을 사용 하여 대상 문자열 을 일치 시 키 는 것 이 검색 에 영향 을 주 는 대상 입 니 다.

  • 또 다른 예외 클래스 인 PatternSyntax Exception 은 불법 검색 모드 를 만 났 을 때 예 외 를 던 집 니 다.
    패턴 개술
    성명:public final class Pattern implements java.io.Serializable
    Pattern 류 는 final 으로 장식 되 어 있 으 며,그 는 자 류 에 의 해 계승 되 지 못 한 다 는 것 을 알 수 있다.
    의미:패턴 클래스,정규 표현 식 의 컴 파일 표시 형식.
    주의:이러한 인 스 턴 스 는 가 변 적 이지 않 습 니 다.여러 개의 병렬 스 레 드 를 안전하게 사용 할 수 있 습 니 다.
    패턴 일치 모드(패턴 플래그)
    copile()방법 은 정규 표현 식 의 일치 행 위 를 제어 하 는 인자 가 필요 합 니 다.
    Pattern Pattern.compile(String regex, int flag)

    flag 의 수치 범위
    필드
    설명 하 다.
    Pattern. UNIX_LINES
            유 닉 스 줄 모드,대부분의 시스템 의 줄 은
    으로 끝 납 니 다.그러나 일부 시스템,예 를 들 어 Windows 는 \r
    조합 으로 끝 납 니 다.이 모드 를 사용 하면
    만 줄 의 끝 문자 로 끝 납 니 다.이것 은^,$와 점(점 번호 가 줄 바 꿈 문자 와 일치)에 영향 을 줄 수 있 습 니 다.        끼 워 넣 는 플래그 표현 식(?d)을 통 해서 도 유 닉 스 줄 모드 를 사용 할 수 있 습 니 다.
    Pattern. CASE_INSENSITIVE
            기본적으로 대소 문자 가 민감 하지 않 은 매 칭 은 US-ASCII 문자 집합 에 만 적 용 됩 니 다.이 표 지 는 표현 식 이 대소 문 자 를 무시 하고 일치 하도록 할 수 있 습 니 다.Unicode 문 자 를 크기 불명 감 에 맞 추 려 면 UNICODE_CASE 을 이 표지 와 합치 면 된다.        임 베 디 드 로고 표현 식(?i)을 통 해 대소 문 자 를 구분 하지 않 는 일치 도 사용 할 수 있 습 니 다.        이 플래그 를 지정 하면 성능 에 영향 을 줄 수 있 습 니 다.
    Pattern. COMMENTS ⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢
            이 모드 에 서 는 일치 할 때 빈 칸 문자(표현 식 의'//s'가 아니 라 표현 식 의 빈 칸,tab,리 턴 등)와 주석(\#부터 이 줄 이 끝 날 때 까지)을 무시 합 니 다.        삽입 식 표지 표현 식(?x)을 통 해서 도 주석 모드 를 사용 할 수 있 습 니 다.
    Pattern. MULTILINE
            기본적으로 입력 한 문자열 은 한 줄 로 간주 되 며,이 줄 에 줄 바 꿈 자 를 싸 도 한 줄 로 간주 된다."^"에서"$"사이 의 내용 이 일치 할 때 전체 입력 은 한 줄 로 보 입 니 다.여러 줄 모드 를 사용 하면 줄 바 꿈 자 를 포함 하 는 입력 이 자동 으로 여러 줄 로 바 뀌 어 일치 합 니 다.        임 베 디 드 로고 표현 식(?m)을 통 해 여러 줄 모드 를 사용 할 수 있 습 니 다.
    Pattern. LITERAL
            글꼴 값 분석 모드 를 사용 합 니 다.        이 플래그 를 지정 하면 지정 한 패턴 의 입력 문자열 은 글자 액면가 문자 시퀀스 로 대 접 됩 니 다.입력 시퀀스 의 메타 문자 나 전의 시퀀스 는 특별한 의 미 를 가지 지 않 습 니 다.        표지 CASE_INSENSITIVEUNICODE_CASE 은 이 표지 와 함께 사용 할 때 일치 하 는 데 영향 을 줄 것 입 니 다.다른 표지 들 은 모두 불필요 해 졌 다.        글자 의 액면가 해석 을 사용 할 수 있 는 삽입 식 표지 문자 가 존재 하지 않 습 니 다.
    Pattern. DOTALL
            이 모드 에서 표현 식 . 은 줄 끝 자 를 포함 하여 모든 문자 와 일치 할 수 있 습 니 다.기본적으로 이 표현 식 은 줄 끝 문자 와 일치 하지 않 습 니 다.        임 베 디 드 로고 표현 식(?s)을 통 해 도 이 모드 를 사용 할 수 있 습 니 다.
    Pattern. UNICODE_CASE
            이 모드 에서 CASE_INSENSITIVE 플래그 를 사용 하면 유 니 코드 문 자 를 대소 문자 에 민감 하지 않 게 일치 합 니 다.기본적으로 대소 문자 불분명 감 의 일치 성 은 US-ASCI 문자 집합 에 만 적 용 됩 니 다.        이 플래그 를 지정 하면 성능 에 영향 을 줄 수 있 습 니 다.
    Pattern. CANON_EQ
            두 글자 의 (canonical decomposition) 이 똑 같은 경우 에 만 일치 하 는 것 으로 인정 된다.예 를 들 어 이 표 지 를 사용 한 후에 표현 식 a/u030A? 과 일치 합 니 다.기본 적 인 상황 에서 (canonical equivalence) 을 고려 하지 않 습 니 다.        이 플래그 를 지정 하면 성능 에 영향 을 줄 수 있 습 니 다.
    이런 표지 중에서 Pattern.CASE_INSENSITIVE,Pattern.MULTILINE,그리고 Pattern.COMMENTS 이 가장 유용 하 다(그 중에서 Pattern.COMMENTS 은 우리 가 생각 을 정리 하고/또는 문 서 를 만 드 는 데 도 도움 을 줄 수 있다).표현 식 에 기 호 를 꽂 는 방식 으로 절대 다수의 모드 를 사용 할 수 있 습 니 다.이 기호 들 은 바로 위의 그 시계의 각 표지 아래 에 있다.모드 가 시작 되 기 를 원 하 는 곳 에 기 호 를 꽂 으 세 요.OR(|)연산 자로 이 표지 들 을 배합 하여 사용 할 수 있다.
    코드 예제
    다 중 모드:Pattern.MULTILINE 예제
    테스트 해 봤 는데 MULTILINE 로고 가 없 으 면 ^$ 은 입력 시퀀스 의 시작 과 끝 에 만 일치 할 수 있 습 니 다.그렇지 않 으 면 입력 시퀀스 내부 의 줄 끝 문자 와 일치 할 수 있 습 니 다.테스트 코드 는 다음 과 같 습 니 다:
    import java.util.regex.*;
    
    /**
     *     
     */
    public class ReFlags_MULTILINE {
    
        public static void main(String[] args) {
    
            //         
            String str = "hello world\r
    "
    + "hello java\r
    "
    + "hello java"; System.out.println("=========== ( )==========="); Pattern p = Pattern.compile("^hello"); Matcher m = p.matcher(str); while (m.find()) { System.out.println(m.group() + " :[" + m.start() + "," + m.end() + "]"); } System.out.println("=========== ( )==========="); p = Pattern.compile("^hello", Pattern.MULTILINE); m = p.matcher(str); while (m.find()) { System.out.println(m.group() + " :[" + m.start() + "," + m.end() + "]"); } System.out.println("=========== ( )==========="); p = Pattern.compile("java$"); m = p.matcher(str); while (m.find()) { System.out.println(m.group() + " :[" + m.start() + "," + m.end() + "]"); } System.out.println("=========== ( )==========="); p = Pattern.compile("java$", Pattern.MULTILINE); m = p.matcher(str); while (m.find()) { System.out.println(m.group() + " :[" + m.start() + "," + m.end() + "]"); } } }
    ===========       (     )===========
    hello     :[0,5]
    ===========       (    )===========
    hello     :[0,5]
    hello     :[13,18]
    hello     :[25,30]
    ===========       (     )===========
    java     :[31,35]
    ===========       (    )===========
    java     :[19,23]
    java     :[31,35]

    대소 문자 무시:Pattern.CASE_INSENSITIVE 예제
    대소 문자 의 일치 성 을 무시 해 야 할 때 도 있다.이 예 는 섭씨 온도 와 화 씨 온도 가 일치 하고 C,c,F 와 f 로 끝 나 는 온도 값 이 모두 일치 합 니 다.
    import java.util.regex.Pattern;
    
    public class ReFlags_CASE_INSENSITIVE {
    
        public static void main(String[] args) {
    
    
            System.out.println("===========API     ===========");
            String moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*[CF]";
            Pattern p = Pattern.compile(moneyRegex,Pattern.CASE_INSENSITIVE);
    
            System.out.println("-3.33c   " + p.matcher("-3.33c").matches());
            System.out.println("-3.33C   " + p.matcher("-3.33C").matches());
    
    
            System.out.println("===========      ===========");
            moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*[CF]";
            p = Pattern.compile(moneyRegex);
    
            System.out.println("-3.33c   " + p.matcher("-3.33c").matches());
            System.out.println("-3.33C   " + p.matcher("-3.33C").matches());
    
    
            System.out.println("===========         ===========");
            moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*(?i)[CF]";
            p = Pattern.compile(moneyRegex);
    
            System.out.println("-3.33c   " + p.matcher("-3.33c").matches());
            System.out.println("-3.33C   " + p.matcher("-3.33C").matches());
    
    
            System.out.println("===========        ===========");
            moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*[CF]";
            p = Pattern.compile(moneyRegex);
    
            System.out.println("-3.33c   " + p.matcher("-3.33c").matches());
            System.out.println("-3.33C   " + p.matcher("-3.33C").matches());
        }
    }
    ===========API     ===========
    -3.33c   true
    -3.33C   true
    ===========      ===========
    -3.33c   false
    -3.33C   true
    ===========         ===========
    -3.33c   true
    -3.33C   true
    ===========        ===========
    -3.33c   false
    -3.33C   true

    설명 사용 하기:Pattern.COMMENTS 예제
    설명 을 사용 하면 정규 표현 식 의 빈 칸 과\#줄 이 무 시 됩 니 다.
    import java.util.regex.Pattern;
    
    public class ReFlags_COMMENTS {
    
        public static void main(String[] args) {
    
            System.out.println("===========API    ===========");
            String comments = "    (\\d)+#this is comments.";
            Pattern p = Pattern.compile(comments, Pattern.COMMENTS);
            System.out.println("1234   " + p.matcher("1234").matches());
    
            System.out.println("===========     ===========");
            comments = "    (\\d)+#this is comments.";
            p = Pattern.compile(comments);
            System.out.println("1234   " + p.matcher("1234").matches());
    
            System.out.println("===========      ===========");
            comments = "(?x)    (\\d)+#this is comments.";
            p = Pattern.compile(comments);
            System.out.println("1234   " + p.matcher("1234").matches());
    
            System.out.println("===========     ===========");
            comments = "    (\\d)+#this is comments.";
            p = Pattern.compile(comments);
            System.out.println("1234   " + p.matcher("1234").matches());
    
        }
    }
    ===========API    ===========
    1234   true
    ===========     ===========
    1234   false
    ===========      ===========
    1234   true
    ===========     ===========
    1234   false

    볼 수 있 습 니 다.\#줄 끝 에 있 는 주석 부분 과 앞의 공백 문 자 는 모두 무시 되 었 습 니 다.정규 표현 식 에 내 장 된 주석 사용 하기(?x)。
    dotall 모드 사용 하기:Pattern.DOTALL 예제
    dotall 모드 를 사용 합 니 다.일반적인 상황 에서 점(.)은 임의의 문자 와 일치 하지만 줄 바 꿈 문자 와 일치 하지 않 습 니 다.이 모드 를 사용 하면 점 수 는 줄 바 꿈 문자 와 일치 할 수 있 습 니 다.
    import java.util.regex.Pattern;
    
    public class ReFlags_DOTALL {
    
        public static void main(String[] args) {
    
            System.out.println("===========API  DOTALL===========");
            String dotall = "(.)*";
            Pattern p = Pattern.compile(dotall, Pattern.DOTALL);
            System.out.println("\\r\
    "
    + p.matcher("\r
    "
    ).matches()); System.out.println("=========== DOTALL==========="); dotall = "(.)*"; p = Pattern.compile(dotall); System.out.println("\\r\
    "
    + p.matcher("\r
    "
    ).matches()); System.out.println("=========== DOTALL==========="); dotall = "(?s)(.)*"; p = Pattern.compile(dotall); System.out.println("\\r\
    "
    + p.matcher("\r
    "
    ).matches()); System.out.println("=========== DOTALL==========="); dotall = "(.)*"; p = Pattern.compile(dotall); System.out.println("\\r\
    "
    + p.matcher("\r
    "
    ).matches()); } }
    ===========API  DOTALL===========
    \r
    true =========== DOTALL=========== \r
    false =========== DOTALL=========== \r
    true =========== DOTALL=========== \r
    false

    문자 모드:Pattern.LITERAL 예제
    이 모드 를 사용 하면 모든 메타 문자,전의 문 자 는 일반적인 문자 로 간주 되 고 다른 의 미 를 가지 지 않 습 니 다.
    import java.util.regex.Pattern;
    
    public class ReFlags_LITERAL {
    
        public static void main(String[] args) {
    
            System.out.println(Pattern.compile("\\d", Pattern.LITERAL).matcher("\\d").matches());// true
            System.out.println(Pattern.compile("\\d", Pattern.LITERAL).matcher("2").matches());// false
    
            System.out.println(Pattern.compile("(\\d)+", Pattern.LITERAL).matcher("1234").matches());// false
            System.out.println(Pattern.compile("(\\d)+").matcher("1234").matches());// true
    
            System.out.println(Pattern.compile("(\\d){2,3}", Pattern.LITERAL).matcher("(\\d){2,3}").matches());// true
        }
    }

    좋은 웹페이지 즐겨찾기