JavaRush /Java Blog /Random-KO /Java의 정규 표현식, 2부

Java의 정규 표현식, 2부

Random-KO 그룹에 게시되었습니다
우리는 Javaworld 웹사이트 를 위해 Jeff Friesen이 작성한 Java 정규식에 대한 짧은 가이드의 번역을 여러분의 주의에 제시합니다 . 읽기 쉽도록 기사를 여러 부분으로 나누었습니다. Java의 정규 표현식, 2부 - 1Java의 정규 표현식, 1부
여러 범위 병합
여러 범위를 나란히 배치하여 단일 범위 문자 클래스로 병합할 수 있습니다. 예를 들어 클래스는 [a-zA-Z]소문자 또는 대문자로 된 모든 라틴 알파벳 문자와 일치합니다.

여러 범위 병합

여러 범위를 나란히 배치하여 단일 범위 문자 클래스로 병합할 수 있습니다. 예를 들어 클래스는 [a-zA-Z]소문자 또는 대문자로 된 모든 라틴 알파벳 문자와 일치합니다.

문자 클래스 결합

문자 클래스 통합은 여러 개의 중첩된 문자 클래스로 구성되며 결과 통합의 모든 문자와 일치합니다. 예를 들어 클래스는 from 및 from to [a-d[m-p]]의 문자와 일치합니다 . 다음 예를 고려하십시오. 이 예는 , , 및 에서 일치하는 문자를 찾습니다 . admpjava RegexDemo [ab[c-e]] abcdefabcdeabcdef
regex = [ab[c-e]]
input = abcdef
Found [a] starting at 0 and ending at 0
Found [b] starting at 1 and ending at 1
Found [c] starting at 2 and ending at 2
Found [d] starting at 3 and ending at 3
Found [e] starting at 4 and ending at 4

문자 클래스 교차

문자 클래스의 교차점은 모든 중첩 클래스에 공통된 문자로 구성되며 공통 문자만 일치합니다. 예를 들어 클래스는 [a-z&&[d-f]]문자 de와 일치합니다 f. 다음 예를 고려하십시오. java RegexDemo "[aeiouy&&[y]]" party Windows 운영 체제에서는 명령 셸이 큰따옴표를 &명령 구분 기호로 처리하므로 큰따옴표가 필요합니다. y이 예에서는 다음과 일치하는 문자만 찾습니다 party.
regex = [aeiouy&&[y]]
input = party
Found [y] starting at 4 and ending at 4

문자 클래스 빼기

빼기 문자 클래스는 중첩된 문자 클래스에 포함된 문자를 제외한 모든 문자로 구성되며 나머지 문자만 일치합니다. 예를 들어, 클래스는 from 및 from to : [a-z&&[^m-p]]에서 문자를 일치시킵니다 . 이 예에서는 다음 에서 일치하는 문자를 찾습니다 . alqzjava RegexDemo "[a-f&&[^a-c]&&[^e]]" abcdefgdfabcdefg
regex = [a-f&&[^a-c]&&[^e]]
input = abcdefg
Found [d] starting at 3 and ending at 3
Found [f] starting at 5 and ending at 5

미리 정의된 문자 클래스

일부 문자 클래스는 약칭 표기법의 사용을 정당화할 만큼 정규 표현식 에 자주 나타납니다. 클래스는 Pattern이러한 약어와 같이 미리 정의된 문자 클래스를 제공합니다. 이를 사용하여 정규식을 단순화하고 구문 오류를 최소화할 수 있습니다. 미리 정의된 문자 클래스에는 표준, POSIX, 스크립트, 블록, 카테고리, 바이너리 등의 유니코드 속성 등 여러 카테고리가 있습니다 java.lang.Character. 다음 목록에는 표준 클래스의 범주만 표시됩니다.
  • \d: 숫자. 동등한 [0-9].
  • \D: 숫자가 아닌 문자입니다. 동등한 [^0-9].
  • \s: 공백 문자입니다. 동등한 [ \t\n\x0B\f\r].
  • \S: 공백 문자가 아닙니다. 동등한 [^\s].
  • \w: 단어 형성 기호. 동등한 [a-zA-Z_0-9].
  • \W: 단어를 형성하는 문자가 아닙니다. 동등한 [^\w].
다음 예에서는 미리 정의된 문자 클래스를 사용하여 \w입력 텍스트의 모든 단어 문자를 설명합니다. java RegexDemo \w "aZ.8 _" 마침표와 공백 문자가 단어 문자로 간주되지 않음을 보여주는 다음 실행 결과를 자세히 살펴보십시오.
regex = \w
input = aZ.8 _
Found [a] starting at 0 and ending at 0
Found [Z] starting at 1 and ending at 1
Found [8] starting at 3 and ending at 3
Found [_] starting at 5 and ending at 5
줄 구분 기호
클래스 SDK 문서에서는 Pattern점 메타 문자를 줄 구분 기호(줄 끝을 표시하는 1~2개의 문자 시퀀스)를 제외한 모든 문자와 일치하는 미리 정의된 문자 클래스로 설명합니다. 예외는 도트가 줄 구분 기호와 일치하는 도트 모드(다음에 설명)입니다. 클래스는 Pattern다음 줄 구분 기호를 구별합니다.
  • 캐리지 리턴 문자( \r);
  • 개행 문자(종이를 한 줄 앞으로 이동하는 기호)( \n);
  • 캐리지 리턴 문자 바로 뒤에 개행 문자( \r\n)가 옵니다.
  • 다음 줄 문자( \u0085);
  • 줄 구분 문자( \u2028);
  • 단락 구분 기호( \u2029)

캡처된 그룹

캡처링 그룹은 패턴으로 검색할 때 나중에 사용할 수 있도록 검색된 문자 집합을 저장하는 데 사용됩니다. 이 구문은 괄호( )로 묶인 메타 문자로 묶인 일련의 문자입니다 ( ). 패턴으로 검색할 때 캡처된 그룹 내의 모든 문자는 하나의 전체로 간주됩니다. 예를 들어 캡처 그룹( Java)은 문자 J, ava단일 단위로 결합합니다. Java이 캡처 그룹은 입력 텍스트에서 패턴의 모든 발생을 찾습니다 . 일치할 때마다 이전에 저장된 문자가 Java다음 문자로 대체됩니다. 캡처된 그룹은 캡처된 다른 그룹 내에 중첩될 수 있습니다. 예를 들어 정규식에서 (Java( language))그룹은 (language)그룹 내에 중첩됩니다 (Java). 중첩되거나 중첩되지 않은 각 캡처 그룹에는 1부터 시작하여 번호가 할당되며 번호는 왼쪽에서 오른쪽으로 지정됩니다. 이전 예에서 는 (Java( language))캡처 그룹 번호 1과 일치하고 캡처 그룹 번호 2와 일치합니다 . (language)정규식에서는 캡처 그룹 번호 1과 캡처 그룹 번호 2와 일치합니다 . 캡처 그룹에 저장된 일치 항목은 나중에 역참조를 사용하여 액세스할 수 있습니다. 백슬래시 문자 뒤에 캡처되는 그룹 번호에 해당하는 숫자가 오는 방식으로 지정되는 역참조를 사용하면 그룹에서 캡처한 텍스트의 문자를 참조할 수 있습니다. 백링크를 사용하면 일치자가 캡처된 그룹의 저장된 검색 결과의 숫자를 기반으로 참조한 다음 해당 결과의 문자를 사용하여 추가 검색을 시도합니다. 다음 예에서는 역참조를 사용하여 텍스트에서 문법 오류를 찾는 방법을 보여줍니다. 이 예에서는 정규식을 사용하여 입력 텍스트 바로 뒤에 중복 단어가 있는 문법 오류를 찾습니다 . 이 정규식은 캡처할 두 개의 그룹을 지정합니다. 숫자 1 – 은 에 해당 하고 숫자 2 – 는 뒤에 오는 공백 문자에 해당합니다 . 역참조를 사용하면 그룹 번호 2의 저장된 결과를 다시 방문하여 일치자가 공백 및 의 첫 번째 발생 직후에 뒤에 공백 의 두 번째 발생을 검색할 수 있습니다 . Matcher의 결과는 다음과 같습니다. (a)(b)(a)(b)Java의 정규 표현식, 2부 - 2java RegexDemo "(Java( language)\2)" "The Java language language"(Java( language)\2)languageJava"The Java language language"(Java( language)\2)Java language language(language)language\2languagelanguageRegexDemo
regex = (Java( language)\2)
input = The Java language language
Found [Java language language] starting at 4 and ending at 25

경계 일치자

때로는 줄의 시작 부분, 단어 경계, 텍스트 끝 부분 등에서 패턴 일치를 수행해야 합니다. Pattern다음 위치에서 일치 항목을 검색하는 정규식 구문인 edge matchers 클래스 중 하나를 사용하여 이를 수행할 수 있습니다 .
  • ^: 줄의 시작;
  • $: 줄 끝;
  • \b: 단어 경계;
  • \B: 유사어 경계;
  • \A: 텍스트 시작;
  • \G: 이전 경기 종료;
  • \Z: 텍스트 끝, 마지막 줄 구분 기호(있는 경우)는 계산하지 않습니다.
  • \z: 텍스트 끝
다음 예에서는 ^경계 일치자 메타 문자를 사용하여 으로 시작하고 The그 뒤에 0개 이상의 단어 문자가 오는 줄을 찾습니다. java RegexDemo "^The\w*" Therefore 문자는 ^입력 텍스트의 처음 3개 문자가 연속 패턴 문자 T, h및 와 일치해야 함을 지정합니다 e. 이 문자는 뒤에 임의의 숫자가 올 수 있습니다. 단어 형성 기호. 실행 결과는 다음과 같습니다.
regex = ^The\w*
input = Therefore
Found [Therefore] starting at 0 and ending at 8
명령줄을 로 변경하면 어떻게 되나요 java RegexDemo "^The\w*" " Therefore"? Therefore입력 텍스트 앞에 공백 문자가 있으므로 일치하는 항목을 찾을 수 없습니다 .

길이가 0인 일치

가끔 에지 매처로 작업할 때 길이가 0인 일치 항목을 만나게 되는 경우가 있습니다. Совпадение нулевой длины문자가 포함되지 않은 일치 항목입니다. 빈 입력 텍스트, 입력 텍스트의 시작 부분, 입력 텍스트의 마지막 문자 뒤, 입력 텍스트의 두 문자 사이에 나타날 수 있습니다. 길이가 0인 일치는 항상 같은 위치에서 시작하고 끝나기 때문에 쉽게 인식할 수 있습니다. 다음 예를 고려하십시오. java RegExDemo \b\b "Java is" 이 예에서는 두 개의 연속된 단어 경계를 검색하며 결과는 다음과 같습니다.
regex = \b\b
input = Java is
Found [] starting at 0 and ending at -1
Found [] starting at 4 and ending at 3
Found [] starting at 5 and ending at 4
Found [] starting at 7 and ending at 6
결과에는 길이가 0인 일치 항목이 여러 개 표시됩니다. RegexDemoListing 1의 소스 코드에서 지정했으므로 여기서 끝 위치는 시작 위치보다 하나 적습니다 end() – 1. Java의 정규 표현식, 2부 - 3

수량자

수량자는 패턴을 숫자 값과 명시적으로 또는 암시적으로 연결하는 정규식 구문입니다. 이 숫자 값은 패턴을 검색할 횟수를 결정합니다. 수량자는 탐욕스러운, 게으른, 초탐욕적인 것으로 구분됩니다.
  • 탐욕 수량자( ?, *또는 +)는 가장 긴 일치 항목을 찾도록 설계되었습니다. 물어봐도 되나요 X? 하나 이하의 항목 찾기 X, X*0개 이상의 항목 찾기 X, X+하나 이상의 항목 찾기 X, 항목 X{n}찾기 , 적어도 (아마도 그 이상) 항목 찾기 및 적어도 더 이상 항목 찾기 .nXX{n,}nXX{n,m}nmX
  • 게으른 수량자( ??, *?또는 +?)는 가장 짧은 일치 항목을 찾도록 설계되었습니다. , ?가 X??하나 이하로 검색되도록 지정할 수 있습니다 . 0개 이상의 항목 찾기 , 하나 이상의 항목 찾기 , 항목 찾기 , 적어도(아마도 그 이상) 항목 찾기 , 적어도 항목 이상 찾기 .XX*XX+?XX{n}?nXX{n,}?nXX{n,m}?nmX
  • 초탐욕 수량자( ?+, *+or ++)는 탐욕 수량자와 유사합니다. 단, 초탐욕 수량자는 가장 긴 일치 항목을 찾기 위해 한 번만 시도하는 반면 탐욕 수량자는 여러 번 시도할 수 있습니다. X?+하나 이하의 항목 찾기 X, X*+0개 이상의 항목 찾기 X, X++하나 이상의 항목 찾기 X, 의 항목 X{n}+찾기 , 최소한(그리고 가능하면 그 이상) 항목 찾기 , 적어도 항목 이하 찾기로 설정할 수 있습니다. .nXX{n,}+nXX{n,m}+ nmX
다음 예에서는 탐욕 수량자의 사용을 보여줍니다. java RegexDemo .*ox "fox box pox" 결과는 다음과 같습니다.
regex = .*ox
input = fox box pox
Found [fox box pox] starting at 0 and ending at 10
탐욕 수량자( .*)는 로 끝나는 가장 긴 문자 시퀀스를 찾습니다 ox. 전체 입력 텍스트를 사용한 다음 입력 텍스트가 이러한 문자로 끝나는 것을 감지할 때까지 롤백합니다. 이제 게으른 수량자를 고려해 보세요. java RegexDemo .*?ox "fox box pox" 결과는 다음과 같습니다.
regex = .*?ox
input = fox box pox
Found [fox] starting at 0 and ending at 2
Found [ box] starting at 3 and ending at 6
Found [ pox] starting at 7 and ending at 10
게으른 수량자( .*?)는 로 끝나는 가장 짧은 문자 시퀀스를 찾습니다 ox. 빈 문자열로 시작하여 일치하는 항목을 찾을 때까지 점차적으로 문자를 사용합니다. 그런 다음 입력 텍스트가 소진될 때까지 계속 작업합니다. 마지막으로 초탐욕 수량자를 살펴보겠습니다. java RegexDemo .*+ox "fox box pox" 결과는 다음과 같습니다.
regex = .*+ox
input = fox box pox
욕심 많은 수량자( )는 모든 입력 텍스트를 소비하고 정규식 끝에 .*+일치하는 항목이 남아 있지 않기 때문에 일치 항목을 찾지 않습니다 . ox탐욕적 수량자와 달리 초탐욕적 수량자는 롤백되지 않습니다.

길이가 0인 일치

때때로 수량자를 사용하여 작업할 때 길이가 0인 일치 항목을 만날 수 있습니다. 예를 들어, 다음 탐욕 수량자를 사용하면 길이가 0인 여러 개의 일치 항목이 생성됩니다. java RegexDemo a? abaa 이 예제를 실행한 결과:
regex = a?
input = abaa
Found [a] starting at 0 and ending at 0
Found [] starting at 1 and ending at 0
Found [a] starting at 2 and ending at 2
Found [a] starting at 3 and ending at 3
Found [] starting at 4 and ending at 3
실행 결과에는 5개의 일치 항목이 있습니다. a첫 번째, 세 번째, 네 번째는 꽤 예상된 것이지만(3개의 문자 위치 에 해당함 abaa) 두 번째와 다섯 번째는 여러분을 놀라게 할 수 있습니다. a마치 본문의 끝 부분에 해당하는 내용을 나타내는 것처럼 보이지만 b실제로는 그렇지 않습니다. 정규식은 텍스트 끝에서 a?검색하지 않습니다 . b유무를 검색합니다 a. a?을 찾지 못하면 길이 a가 0인 일치 항목으로 보고합니다.

중첩된 플래그 표현식

매처는 정규식을 패턴으로 컴파일할 때 재정의할 수 있는 몇 가지 기본 가정을 만듭니다. 이 문제는 나중에 논의하겠습니다. 정규 표현식을 사용하면 중첩된 플래그 표현식을 사용하여 기본값을 재정의할 수 있습니다. 이 정규식 구성은 물음표 메타 문자( ?) 주위에 괄호로 묶인 메타 문자와 그 뒤에 라틴 소문자로 지정됩니다. 클래스는 Pattern다음과 같은 중첩 플래그 표현식을 이해합니다.
  • (?i): 대소문자를 구분하지 않는 패턴 일치를 활성화합니다. 예를 들어, 명령을 사용할 때 java RegexDemo (?i)tree Treehouse문자 순서는 Tree패턴과 일치합니다 tree. 기본값은 대소문자를 구분하는 패턴 검색입니다.
  • (?x): 패턴 내에서 메타 문자로 시작하는 공백 문자와 주석을 사용할 수 있습니다 #. 매처는 둘 다 무시합니다. 예를 들어 java RegexDemo ".at(?x)#match hat, cat, and so on" matter문자 시퀀스의 경우 mat패턴과 일치합니다 .at. 기본적으로 공백 문자와 주석은 허용되지 않으며 매처는 이를 검색에 포함된 문자로 처리합니다.
  • (?s): 점 메타 문자가 다른 문자 외에 줄 구분 기호와 일치하는 도트 모드를 활성화합니다. 예를 들어, 이 명령은 java RegexDemo (?s). \n개행 문자를 찾습니다. 기본값은 dotall의 반대입니다. 즉, 줄 구분 기호를 찾을 수 없습니다. 예를 들어, 이 명령은 Java RegexDemo . \n개행 문자를 찾지 않습니다.
  • (?m): 각 줄의 ^시작과 $끝을 일치시키는 여러 줄 모드를 활성화합니다. 예를 들어, java RegexDemo "(?m)^abc$" abc\nabc입력 텍스트에서 두 시퀀스를 모두 찾습니다 abc. 기본적으로 단일 행 모드가 사용됩니다. ^전체 입력 텍스트의 시작 부분과 일치하고 $끝 부분과 일치합니다. 예를 들어 java RegexDemo "^abc$" abc\nabc일치하는 항목이 없다는 응답을 반환합니다.
  • (?u): 유니코드 구분 대소문자 정렬을 활성화합니다. 이 플래그를 와 함께 사용하면 (?i)유니코드 표준에 따라 대소문자를 구분하지 않는 패턴 일치가 가능합니다. 기본 설정은 대소문자를 구분하고 US-ASCII 문자만 검색하는 것입니다.
  • (?d).: 매처가 컨텍스트의 메타 문자 와 줄 구분 기호만 ^인식 하는 Unix 스타일 문자열 모드를 활성화합니다 . 기본값은 유닉스가 아닌 스타일의 문자열 모드입니다. 매처는 위 메타 문자의 맥락에서 모든 줄 구분 기호를 인식합니다.$\n
중첩된 플래그 표현식은 해당 문자가 괄호 메타 문자로 둘러싸여 있기 때문에 캡처된 그룹과 유사합니다. 캡처된 그룹과 달리 중첩된 플래그 식은 텍스트 문자를 캡처하지 않는 정규식 구문인 캡처되지 않은 그룹의 예입니다. 이는 괄호의 메타 문자로 둘러싸인 일련의 문자로 정의됩니다.
여러 개의 중첩된 플래그 표현식 지정
여러 개의 중첩된 플래그 표현식을 나란히 배치하거나( (?m)(?i))) 순차적으로 정의하는 문자를 배치하여( (?mi)) 정규식에서 여러 중첩 플래그 표현식을 지정할 수 있습니다.

결론

아마 지금쯤 깨달으셨겠지만, 정규 표현식은 매우 유용하며 구문의 미묘한 차이를 익히면 더욱 유용해집니다. 지금까지 정규식과 Pattern. Pattern2부에서는 Regex API에 대해 자세히 살펴보고 , Matcher및 의 메서드를 살펴보겠습니다 PatternSyntaxException. 또한 프로그램에서 즉시 사용할 수 있는 Regex API의 두 가지 실제 응용 프로그램도 보여 드리겠습니다. Java 정규식, 3부 Java 정규식, 4부 Java 정규식, 5부
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION