정규식에 대한 연구를 계속해 봅시다. 이 기사에서는 미리 정의된 문자 클래스와 수량화(시퀀스 검색)를 살펴보겠습니다.
미리 정의된 문자 클래스
클래스 API에는Pattern
일반적으로 사용되는 정규식에 대한 편리한 바로 가기를 제공하는 사전 정의된 문자 클래스가 포함되어 있습니다. 이 표에서 왼쪽 열의 구문은 오른쪽 열의 표현식을 간략하게 표현한 것입니다. 예를 들어 \d
숫자(0-9), \w
대문자 또는 소문자, 밑줄 또는 숫자를 의미합니다. 가능하면 미리 정의된 문자 클래스를 사용하십시오. 이렇게 하면 코드를 더 쉽게 읽고 오류를 수정할 수 있습니다. 백슬래시로 시작하는 구문을 이스케이프 또는 보호라고 합니다. \Q
이전 기사에서 백슬래시나 기호를 사용하여 특수 문자를 이스케이프 처리 하고 \E
이를 일반 문자로 사용하는 방법 에 대해 이미 설명했습니다 . 일반 문자(리터럴)와 함께 백슬래시를 사용하는 경우 표현식을 컴파일하려면 백슬래시를 이스케이프 처리해야 합니다.
private final String REGEX = "\\d"; // цифра
이 예에서는 \d
정규식입니다. 프로그램을 컴파일하려면 추가 백슬래시가 필요합니다. 테스트 프로그램은 콘솔에서 직접 정규식을 읽으므로 추가 슬래시가 필요하지 않습니다. 다음 예에서는 미리 정의된 문자 클래스의 사용을 보여줍니다. 처음 세 가지 예에서 정규식은 단순히 .
모든 문자를 의미하는 " "(점 특수 문자)입니다. 따라서 모든 경우에 검색이 성공했습니다. 다른 예에서는 미리 정의된 문자 클래스를 사용하며, 그 의미는 위 표에서 논의했습니다.
수량자
수량자를 사용 하면 문자열에서 문자의 발생 횟수를 지정할 수 있습니다. 탐욕스러운 수량자, 게으른 수량자, 매우 탐욕스러운 수량자가 어떻게 작동하는지 자세히 살펴보겠습니다. 언뜻 보면 수량자 X?, X?? 그리고 X?+는 같은 방식으로 작동합니다. 즉, "X는 한 번 존재하거나 전혀 존재하지 않습니다." 이러한 수량자의 구현에는 약간의 차이가 있는데, 이에 대해서는 아래에서 살펴보겠습니다.길이가 0인 일치
욕심 많은 것부터 시작합시다. 문자 "a"와 특수 문자 ?, * 또는 +라는 세 가지 정규식을 작성해 보겠습니다. 빈 줄에서 이러한 정규 표현식을 테스트하면 어떤 일이 발생하는지 살펴보겠습니다. 위의 예에서 표현식 a? 때문에 처음 두 경우에서 검색이 성공했습니다. 그리고 a*는 문자 a가 문자열에서 누락되는 것을 허용합니다. 또한 시작 및 마지막 일치 인덱스는 동일합니다(0). 입력 문자열에는 길이가 없으므로 프로그램은 첫 번째 위치에서 아무 것도 찾지 않습니다. 이 경우를 길이가 0인 일치라고 합니다. 이러한 일치는 입력 줄이 비어 있는 경우, 입력 줄의 시작 부분, 줄의 마지막 문자 뒤 또는 줄의 문자 사이 등 여러 경우에 발생합니다. 길이가 0인 일치 항목은 쉽게 찾을 수 있습니다. 동일한 위치에서 시작하고 끝납니다. 길이가 0인 일치 항목의 몇 가지 예를 더 살펴보겠습니다. 몇 가지 예를 더 들어 길이가 0인 일치 항목을 살펴보겠습니다. 입력 문자열을 문자 "a"로 변경하고 흥미로운 효과를 관찰해 보겠습니다. 세 수량자 모두 문자 "a"를 찾았지만 문자가 없는 것을 허용하는 처음 두 수량자는 위치 1에서 길이가 0인 일치를 찾았습니다. - 문자열의 마지막 문자 뒤. 이는 프로그램이 문자 "a"를 문자열로 처리하고 더 이상 일치하는 항목이 없을 때까지 "실행"하기 때문에 발생합니다. 사용된 수량자에 따라 프로그램은 문자열 끝에서 "아무것도" 찾지 않거나 찾지 않습니다. 이제 입력 문자열을 5개의 문자 "a" 시퀀스로 변경해 보겠습니다. 정규식 a? 문자열의 각 문자에 대해 개별적으로 일치하는 항목을 찾습니다. a* 표현식은 두 개의 일치 항목, 즉 문자 시퀀스 "a"'와 위치 5에서 길이가 0인 일치 항목을 찾습니다. 그리고 마지막으로, 정규식 a+는 "아무것도" 찾지 않고 문자 "a"의 시퀀스만 찾습니다. :) 다른 문자를 포함하는 문자열이 입력으로 주어지면 어떻게 될까요? 예를 들어, "ababaaaab": 문자 "b"는 위치 1, 3, 8에 있고 프로그램은 이 위치에서 길이가 0인 일치 항목을 찾습니다. 정규식은? "b"에 주의를 기울이지 않고 단순히 문자 "a"의 존재(또는 부재)를 찾습니다. 수량자가 "a"의 부재를 허용하는 경우 문자열에서 "a"를 제외한 모든 문자는 길이가 0인 일치 항목으로 표시됩니다. 주어진 길이의 시퀀스를 찾으려면 중괄호로 길이를 지정하면 됩니다. 정규식 a{3}는 세 개의 "a" 문자 시퀀스를 찾습니다. 첫 번째 줄에는 a가 충분하지 않아 아무것도 발견되지 않았습니다. 두 번째에는 프로그램이 찾는 3개의 문자가 포함되어 있습니다. 세 번째 테스트에서도 문자열 시작 부분에서 일치하는 항목을 찾습니다. 세 번째 문자 이후의 모든 항목은 정규식을 충족하지 않습니다. 아래 코드에서는 정규식을 충족하며 여러 일치 항목이 있습니다. 최소 시퀀스 길이를 지정하려면 다음을 사용하세요.Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
이 예에서는 문자열이 (3) "a" 문자의 최소 시퀀스 길이 요구 사항을 충족하므로 프로그램은 일치 항목을 하나만 찾습니다. 마지막으로 최대 시퀀스 길이를 설정합니다. 이 예에서 첫 번째 일치는 6번째 문자에서 끝났습니다. 두 번째 일치 항목에는 여섯 번째 항목 이후의 문자가 포함됩니다. 최소 길이 요구 사항을 충족합니다. 문자열이 한 문자 더 짧으면 두 번째 일치 항목이 없습니다.
GO TO FULL VERSION