JavaRush /Java Blog /Random-KO /Java 정규식의 기초. 3부
articles
레벨 15

Java 정규식의 기초. 3부

Random-KO 그룹에 게시되었습니다
정규식에 대한 연구를 계속해 봅시다. 이 기사에서는 미리 정의된 문자 클래스와 수량화(시퀀스 검색)를 살펴보겠습니다. Java 정규식의 기초.  파트 3 - 1

미리 정의된 문자 클래스

클래스 API에는 Pattern일반적으로 사용되는 정규식에 대한 편리한 바로 가기를 제공하는 사전 정의된 문자 클래스가 포함되어 있습니다. Java 정규식의 기초.  파트 3 - 2이 표에서 왼쪽 열의 구문은 오른쪽 열의 표현식을 간략하게 표현한 것입니다. 예를 들어 \d숫자(0-9), \w대문자 또는 소문자, 밑줄 또는 숫자를 의미합니다. 가능하면 미리 정의된 문자 클래스를 사용하십시오. 이렇게 하면 코드를 더 쉽게 읽고 오류를 수정할 수 있습니다. 백슬래시로 시작하는 구문을 이스케이프 또는 보호라고 합니다. \Q이전 기사에서 백슬래시나 기호를 사용하여 특수 문자를 이스케이프 처리 하고 \E이를 일반 문자로 사용하는 방법 에 대해 이미 설명했습니다 . 일반 문자(리터럴)와 함께 백슬래시를 사용하는 경우 표현식을 컴파일하려면 백슬래시를 이스케이프 처리해야 합니다.
private final String REGEX = "\\d"; // цифра
이 예에서는 \d정규식입니다. 프로그램을 컴파일하려면 추가 백슬래시가 필요합니다. 테스트 프로그램은 콘솔에서 직접 정규식을 읽으므로 추가 슬래시가 필요하지 않습니다. 다음 예에서는 미리 정의된 문자 클래스의 사용을 보여줍니다. Java 정규식의 기초.  파트 3 - 3Java 정규식의 기초.  파트 3 - 4처음 세 가지 예에서 정규식은 단순히 .모든 문자를 의미하는 " "(점 특수 문자)입니다. 따라서 모든 경우에 검색이 성공했습니다. 다른 예에서는 미리 정의된 문자 클래스를 사용하며, 그 의미는 위 표에서 논의했습니다.

수량자

Java 정규식의 기초.  파트 3 - 4수량자를 사용 하면 문자열에서 문자의 발생 횟수를 지정할 수 있습니다. 탐욕스러운 수량자, 게으른 수량자, 매우 탐욕스러운 수량자가 어떻게 작동하는지 자세히 살펴보겠습니다. 언뜻 보면 수량자 X?, X?? 그리고 X?+는 같은 방식으로 작동합니다. 즉, "X는 한 번 존재하거나 전혀 존재하지 않습니다." 이러한 수량자의 구현에는 약간의 차이가 있는데, 이에 대해서는 아래에서 살펴보겠습니다.

길이가 0인 일치

욕심 많은 것부터 시작합시다. 문자 "a"와 특수 문자 ?, * 또는 +라는 세 가지 정규식을 작성해 보겠습니다. 빈 줄에서 이러한 정규 표현식을 테스트하면 어떤 일이 발생하는지 살펴보겠습니다. Java 정규식의 기초.  파트 3 - 5위의 예에서 표현식 a? 때문에 처음 두 경우에서 검색이 성공했습니다. 그리고 a*는 문자 a가 문자열에서 누락되는 것을 허용합니다. 또한 시작 및 마지막 일치 인덱스는 동일합니다(0). 입력 문자열에는 길이가 없으므로 프로그램은 첫 번째 위치에서 아무 것도 찾지 않습니다. 이 경우를 길이가 0인 일치라고 합니다. 이러한 일치는 입력 줄이 비어 있는 경우, 입력 줄의 시작 부분, 줄의 마지막 문자 뒤 또는 줄의 문자 사이 등 여러 경우에 발생합니다. 길이가 0인 일치 항목은 쉽게 찾을 수 있습니다. 동일한 위치에서 시작하고 끝납니다. 길이가 0인 일치 항목의 몇 가지 예를 더 살펴보겠습니다. 몇 가지 예를 더 들어 길이가 0인 일치 항목을 살펴보겠습니다. 입력 문자열을 문자 "a"로 변경하고 흥미로운 효과를 관찰해 보겠습니다. Java 정규식의 기초.  파트 3 - 6세 수량자 모두 문자 "a"를 찾았지만 문자가 없는 것을 허용하는 처음 두 수량자는 위치 1에서 길이가 0인 일치를 찾았습니다. - 문자열의 마지막 문자 뒤. 이는 프로그램이 문자 "a"를 문자열로 처리하고 더 이상 일치하는 항목이 없을 때까지 "실행"하기 때문에 발생합니다. 사용된 수량자에 따라 프로그램은 문자열 끝에서 "아무것도" 찾지 않거나 찾지 않습니다. 이제 입력 문자열을 5개의 문자 "a" 시퀀스로 변경해 보겠습니다. Java 정규식의 기초.  파트 3 - 7정규식 a? 문자열의 각 문자에 대해 개별적으로 일치하는 항목을 찾습니다. a* 표현식은 두 개의 일치 항목, 즉 문자 시퀀스 "a"'와 위치 5에서 길이가 0인 일치 항목을 찾습니다. 그리고 마지막으로, 정규식 a+는 "아무것도" 찾지 않고 문자 "a"의 시퀀스만 찾습니다. :) 다른 문자를 포함하는 문자열이 입력으로 주어지면 어떻게 될까요? 예를 들어, "ababaaaab": Java 정규식의 기초.  파트 3 - 8문자 "b"는 위치 1, 3, 8에 있고 프로그램은 이 위치에서 길이가 0인 일치 항목을 찾습니다. 정규식은? "b"에 주의를 기울이지 않고 단순히 문자 "a"의 존재(또는 부재)를 찾습니다. 수량자가 "a"의 부재를 허용하는 경우 문자열에서 "a"를 제외한 모든 문자는 길이가 0인 일치 항목으로 표시됩니다. 주어진 길이의 시퀀스를 찾으려면 중괄호로 길이를 지정하면 됩니다. Java 정규식의 기초.  파트 3 - 9정규식 a{3}는 세 개의 "a" 문자 시퀀스를 찾습니다. 첫 번째 줄에는 a가 충분하지 않아 아무것도 발견되지 않았습니다. 두 번째에는 프로그램이 찾는 3개의 문자가 포함되어 있습니다. 세 번째 테스트에서도 문자열 시작 부분에서 일치하는 항목을 찾습니다. 세 번째 문자 이후의 모든 항목은 정규식을 충족하지 않습니다. 아래 코드에서는 정규식을 충족하며 여러 일치 항목이 있습니다. Java 정규식의 기초.  파트 3 - 10최소 시퀀스 길이를 지정하려면 다음을 사용하세요.
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" 문자의 최소 시퀀스 길이 요구 사항을 충족하므로 프로그램은 일치 항목을 하나만 찾습니다. 마지막으로 최대 시퀀스 길이를 설정합니다. Java 정규식의 기초.  파트 3 - 11이 예에서 첫 번째 일치는 6번째 문자에서 끝났습니다. 두 번째 일치 항목에는 여섯 번째 항목 이후의 문자가 포함됩니다. 최소 길이 요구 사항을 충족합니다. 문자열이 한 문자 더 짧으면 두 번째 일치 항목이 없습니다.

수량자와 함께 문자 그룹 및 클래스 사용

지금까지 우리는 동일한 문자를 포함하는 문자열에 대한 수량자를 테스트했습니다. 수량자는 단일 문자에만 적용되므로 정규식 "abc+"는 "ab" 및 "c"를 한 번 이상 포함하는 문자열과 일치합니다. "abc"를 한 번 이상 의미하지는 않습니다. 그러나 한정자는 [abc]+(a 또는 b 또는 c, 1회 이상) 또는 (abc)+(“abc” 1회 이상)와 같이 그룹 및 문자 클래스와 함께 사용할 수 있습니다. 한 줄에 세 번 문자 그룹(개)을 찾아보겠습니다. Java 정규식의 기초.  파트 3 - 12첫 번째 예에서 프로그램은 일치하는 항목을 찾습니다. 수량자는 문자 그룹으로 확장됩니다. 대괄호를 제거하면 한정자 {3}는 문자 "g"에만 적용됩니다. 문자 클래스와 함께 수량자를 사용할 수도 있습니다. Основы регулярных выражений в Java. Часть 3 - 13{3} 수량자는 첫 번째 예에서는 대괄호 안의 문자 클래스에 적용되고 두 번째 예에서는 문자 "c"에만 적용됩니다.

탐욕스러운 수량자, 게으른 수량자, 지나치게 탐욕스러운 수량자의 차이점

탐욕스러운 수량자, 꺼리는 수량자, 소유욕 수량자 간에는 약간의 차이가 있습니다. 탐욕 수량자는 가능한 가장 긴 일치 항목을 찾으려고 하기 때문에 그렇게 명명되었습니다. 프로그램은 먼저 전체 문자열을 "먹으려고" 시도하고, 일치 항목이 발견되지 않으면 문자 하나를 버리고 일치 항목을 찾을 때까지 검색을 반복합니다. 더 이상 문자가 남지 않습니다. 반면에 게으른 사람들은 줄의 시작 부분에서 시작하여 일치하는 항목을 찾을 때까지 문자를 하나씩 추가합니다. 마지막으로 질투 정량화는 탐욕처럼 문자를 제거하지 않고 전체 문자열을 한 번 검색합니다. 데모를 위해 xfooxxxxxxfoo 문자열을 사용합니다. Основы регулярных выражений в Java. Часть 3 - 14첫 번째 예에서는 욕심 많은 .* 수량자를 사용하여 0회 이상 문자를 찾고 그 뒤에 문자 "f" "o" "o"가 오는 것을 찾습니다. 한정자는 탐욕적이므로 발견된 일치 항목에는 전체 문자열이 포함됩니다. 욕심 많은 수량자는 문자열에서 일치하는 항목을 모두 찾을 수 없습니다. 첫 번째 단계에서는 전체 문자열을 스캔한 후 일치하는 항목을 찾아 작업을 완료합니다. 두 번째 예는 게으르고 줄의 시작 부분부터 시작하여 문자별로 추가합니다. 프로그램은 "공허함"을 확인하는 것으로 시작하지만 이후 시퀀스 "foo"가 줄의 시작 부분에 없으면 문자 "x"를 추가하여 검색을 계속하고 그 후 인덱스 0과 4 사이에서 첫 번째 일치 항목을 찾습니다. 검색은 줄의 끝까지 계속됩니다. 두 번째 일치 항목은 인덱스 4와 13 사이에서 발견됩니다. 세 번째 예에서는 수량자가 질투하기 때문에 일치 항목을 찾지 못합니다. 이 경우 정규식 .*+는 전체 줄을 "먹고" "foo"에 대해 아무것도 남기지 않습니다. 문자열에서 불필요한 것을 삭제해야 할 때 질투 수량자를 사용하면 동등한 탐욕 수량자보다 더 효과적입니다. 그게 다야! 소스 링크: Java 정규식의 기초. 3부
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION