패턴 (Java Platform SE 7)

정규 표현식의 컴파일 된 표현입니다.

문자열로 지정된 정규식은 먼저이 클래스의 인스턴스로 컴파일되어야합니다. 그런 다음 결과 패턴을 사용하여 임의의 문자 시퀀스 Matcher 개체를 만들 수 있습니다. / div> 정규 표현식에 대해. 일치를 수행하는 데 관련된 모든 상태가 일치 자에 있으므로 많은 일치자가 동일한 패턴을 공유 할 수 있습니다.

따라서 일반적인 호출 순서는 다음과 같습니다.

 Pattern p = Pattern.
("a*b"); Matcher m = p.
("aaaaab"); boolean b = m.
();

matches 메소드는 정규 표현식이 한 번만 사용되는 경우의 편의를 위해이 클래스에 의해 정의됩니다. 이 메소드는 표현식을 컴파일하고 단일 호출에서 입력 시퀀스를 일치시킵니다.

 boolean b = Pattern.matches("a*b", "aaaaab");

문은 위의 세 문과 동일합니다. 반복되는 일치의 경우 컴파일 된 패턴을 재사용 할 수 없기 때문에 효율성이 떨어집니다.

이 클래스의 인스턴스는 변경할 수 없으며 여러 동시 스레드에서 사용하기에 안전합니다. Matcher 클래스의 인스턴스는 이러한 사용에 안전하지 않습니다.

정규식 구문 요약

백 슬래시, 이스케이프 및 인용

백 슬래시 문자 ( “\”)는 다음에 정의 된대로 이스케이프 된 구문을 도입하는 역할을합니다. 위의 표와 그렇지 않으면 이스케이프되지 않은 구조로 해석 될 문자를 인용합니다. 따라서 표현식 \\는 단일 백 슬래시와 일치하고 \ {는 왼쪽 중괄호와 일치합니다.

이스케이프 된 구조를 나타내지 않는 알파벳 문자 앞에 백 슬래시를 사용하는 것은 오류입니다. 정규 표현식 언어에 대한 향후 확장을 위해 예약되어 있습니다. 문자가 이스케이프 처리되지 않은 구조의 일부인지 여부에 관계없이 알파벳이 아닌 문자 앞에 백 슬래시를 사용할 수 있습니다.

Java 소스 코드의 문자열 리터럴 내의 백 슬래시는 Java ™ 언어 사양에서 요구하는대로 유니 코드 이스케이프 (섹션 3.3) 또는 기타 문자 이스케이프 (섹션 3.10.6)로 해석되므로 이중 백 슬래시가 필요합니다. Java 바이트 코드 컴파일러에 의한 해석으로부터 보호하기 위해 정규식을 나타내는 문자열 리터럴에서. 예를 들어, 문자열 리터럴 “\ b”는 정규식으로 해석 될 때 단일 백 스페이스 문자와 일치하는 반면 “\\ b”는 단어 경계와 일치합니다. 문자열 리터럴 “\ (hello \)”는 불법이며 컴파일 타임 오류가 발생합니다. 문자열 (hello)과 일치하려면 문자열 리터럴 “\\ (hello \\)”를 사용해야합니다.

문자 클래스

문자 클래스는 다른 문자 클래스 내에 나타날 수 있으며 통합 연산자 (암시 적) 및 교차 연산자 (& &). 통합 연산자는 피연산자 클래스 중 하나 이상에있는 모든 문자를 포함하는 클래스를 나타냅니다. 교차 연산자는 두 피연산자 클래스 모두에있는 모든 문자를 포함하는 클래스를 나타냅니다.

문자 클래스 연산자의 우선 순위는 가장 높은 것부터 가장 낮은 것까지 다음과 같습니다.

1 리터럴 이스케이프 \ x
2 그룹화
3 범위 az
4 연합
5 교차로 ]

다른 메타 문자 집합이 문자 클래스 내부와 캐릭터 클래스. 예를 들어 정규 표현식. 문자 클래스 내에서 특수한 의미를 잃는 반면 표현식은 메타 문자를 형성하는 범위가됩니다.

줄 종결 자

줄 종결자는 입력 문자 시퀀스의 줄 끝을 표시하는 1 자 또는 2 자 시퀀스입니다. 다음은 줄 종결 자로 인식됩니다.

UNIX_LINES 모드가 활성화 된 경우 인식되는 유일한 줄 종결자는 개행 문자입니다.

정규식. DOTALL 플래그가 지정되지 않은 경우 줄 종결자를 제외한 모든 문자와 일치합니다.

기본적으로 정규식 ^ 및 $는 줄 종결자를 무시하고 전체 입력 시퀀스의 시작 부분과 끝 부분에서만 각각 일치합니다. MULTILINE 모드가 활성화 된 경우 ^는 입력 시작 부분과 입력 끝 부분을 제외한 모든 줄 종결 자 뒤에서 일치합니다. MULTILINE 모드에서 $는 줄 종결 자 바로 앞이나 입력 시퀀스의 끝과 일치합니다.

그룹 및 캡처

그룹 번호

캡처 그룹은 여는 괄호를 왼쪽에서 오른쪽으로 세어 번호가 매겨집니다.예를 들어 ((A) (B (C))) 표현식에는 다음과 같은 네 개의 그룹이 있습니다.

1

((A) (B (C)))

2

(A)

3

(B (C))

4

(C)

그룹 0은 항상 전체 표현식을 나타냅니다.

캡처 그룹은 일치하는 동안 해당 그룹과 일치하는 입력 시퀀스의 각 하위 시퀀스가 저장되기 때문에 이름이 지정됩니다. 캡처 된 하위 시퀀스는 나중에 역 참조를 통해 표현식에서 사용할 수 있으며 일치 작업이 완료되면 일치 자에서 검색 할 수도 있습니다.

그룹 이름

캡처 그룹에는 “이름”, 명명 된 캡처 그룹을 할당 한 다음 나중에 “이름”으로 역 참조 할 수도 있습니다. 그룹 이름은 다음 문자로 구성됩니다. 첫 번째 문자는 문자 여야합니다.

명명 된 캡처 그룹은 여전히 그룹 번호에 설명 된대로 번호가 지정됩니다.

그룹과 관련된 캡처 된 입력은 항상 그룹이 가장 최근에 일치 한 하위 시퀀스입니다. 정량화로 인해 그룹이 두 번째로 평가되는 경우 두 번째 평가가 실패하면 이전에 캡처 된 값이 유지됩니다. 예를 들어, 표현식 (a (b)?) +에 대해 문자열 “aba”를 일치 시키면 그룹 2는 “b”로 설정됩니다. 캡처 된 모든 입력은 각 일치가 시작될 때 삭제됩니다.

(?로 시작하는 그룹은 텍스트를 캡처하지 않고 그룹 합계에 포함되지 않는 순수하고 캡처하지 않는 그룹이거나 명명 된 캡처 그룹입니다.

유니 코드 지원

이 클래스는 유니 코드 기술 표준 # 18의 레벨 1 : 유니 코드 정규 표현식과 RL2.1 정식 동등 항목을 준수합니다.

Java 소스 코드에서 \ u2014와 같은 유니 코드 이스케이프 시퀀스 Java ™ 언어 사양의 섹션 3.3에 설명 된대로 처리됩니다. 이러한 이스케이프 시퀀스는 정규식 구문 분석기에 의해 직접 구현되므로 파일 또는 키보드에서 읽은 표현식에서 유니 코드 이스케이프를 사용할 수 있습니다. 따라서 문자열 ” \ u2014 “와”\\ u2014 “는 같지 않지만 16 진수 값이 0x2014 인 문자와 일치하는 동일한 패턴으로 컴파일됩니다.

유니 코드 문자는 다음을 사용하여 정규식으로 나타낼 수도 있습니다. \ x {…} 구문에 설명 된대로 16 진수 표기법 (16 진수 코드 포인트 값), 예를 들어, 보조 문자 U + 2011F는 서로 게이트 쌍 \ uD840 \ uDD1F의 두 연속 유니 코드 이스케이프 시퀀스 대신 \ x {2011F}로 지정할 수 있습니다.

유니 코드 스크립트, 블록, 범주 및 바이너리 속성은 Perl에서와 같이 \ p 및 \ P 구조로 작성됩니다. \ p {prop}는 입력에 속성 속성이 있으면 일치하고 \ P {prop}는 입력에 해당 속성이 있으면 일치하지 않습니다.

스크립트, 블록, 범주 및 이진 속성은 문자 클래스 내부와 외부에서 모두 사용할 수 있습니다.

스크립트는 IsHiragana에서와 같이 접두사 Is를 사용하거나 script 키워드 (또는 약식 sc) (script=Hiragana 또는 sc=Hiragana.

Pattern에서 지원하는 스크립트 이름은 UnicodeScript.forName에서 허용하고 정의한 유효한 스크립트 이름입니다.

블록은 InMongolian에서와 같이 접두사 In를 사용하거나 키워드 block (또는 약식 blk) (block=Mongolian 또는 blk=Mongolian.

Pattern에서 지원하는 블록 이름은 UnicodeBlock.forName에서 허용하고 정의한 유효한 블록 이름입니다.

카테고리는 선택적 접두사 Is로 지정할 수 있습니다. \p{L}\p{IsL}는 유니 코드 문자의 범주를 나타냅니다. 스크립트 및 블록과 마찬가지로 카테고리는 iv id 에서처럼 키워드 general_category (또는 약식 gc)를 사용하여 지정할 수도 있습니다. = “b74c30a440”> 또는 gc=Lu.

지원되는 카테고리는 Character 클래스에서 지정한 버전의 유니 코드 표준입니다. 카테고리 이름은 규범 적 및 정보 적 모두 표준에 정의 된 이름입니다.

바이너리 속성은 IsAlphabetic에서와 같이 접두사 Is로 지정됩니다.Pattern에서 지원하는 바이너리 속성은

  • 알파벳
  • 표의 문자
  • 문자
  • 소문자
  • 대문자
  • 제목 대문자
  • 구두점
  • 제어
  • White_Space
  • 숫자
  • Hex_Digit
  • Noncharacter_Code_Point
  • 할당 됨

사전 정의 된 문자 클래스 및 POSIX 문자 클래스는 권장 사항을 준수합니다. 부록 C : UNICODE_CHARACTER_CLASS 플래그가 지정된 경우 유니 코드 정규식의 호환성 속성.

java.lang.Character 부울 ismethodname 메소드 (사용되지 않는 메소드 제외)처럼 작동하는 카테고리는 지정된 속성의 이름이 javamethodname 인 동일한 \ p {prop} 구문을 통해 사용할 수 있습니다.

Perl 5와 비교

Pattern 엔진은 Perl 5에서와 같이 순서가 변경된 기존 NFA 기반 일치를 수행합니다.

이 클래스에서 지원하지 않는 Perl 구성 :

이 클래스에서 지원하지만 Perl에서는 지원하지 않는 구성 :

  • 설명 된대로 문자 클래스 공용체 및 교차 위.

Perl과의 주목할만한 차이점 :

  • Perl에서 \ 1에서 \ 9는 항상 역 참조로 해석됩니다. 9보다 큰 백 슬래시 이스케이프 된 숫자는 최소한 많은 하위 표현식이 존재하는 경우 역 참조로 처리됩니다. 그렇지 않으면 가능한 경우 8 진 이스케이프로 해석됩니다. 이 클래스에서 8 진 이스케이프는 항상 0으로 시작해야합니다. 이 클래스에서 \ 1에서 \ 9는 항상 역 참조로 해석되며, 정규식의 해당 지점에 하위식이 적어도 많은 경우에는 더 큰 숫자가 역 참조로 허용됩니다. 그렇지 않으면 파서는 숫자가 될 때까지 숫자를 삭제합니다. 기존 그룹 수보다 작거나 같거나 한 자리입니다.

  • Perl은 g 플래그를 사용하여 마지막 일치가 중단 된 지점에서 다시 시작되는 일치를 요청합니다. 이 기능은 Matcher 클래스에 의해 암시 적으로 제공됩니다. find 메서드의 반복 된 호출은 매 처가 아닌 경우 마지막 일치가 중단 된 지점에서 다시 시작됩니다. 재설정됩니다.

  • Perl에서 표현식의 최상위 레벨에 포함 된 플래그는 전체 표현식에 영향을줍니다. 이 클래스에서 포함 된 플래그는 최상위 수준에 있든 그룹 내에 있든 상관없이 항상 나타나는 지점에서 적용됩니다. 후자의 경우 플래그는 Perl에서와 같이 그룹의 끝에 복원됩니다.

정규식 구조의 동작에 대한보다 정확한 설명은 Mastering Regular Expressions, 3nd Edition, Jeffrey EF Friedl, O “Reilly and Associates, 2006을 참조하십시오.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다