매칭 모드
JDK는 욕심, 꺼림, 소유의 세 가지 매칭 모드를 제공하며, 이는 각각 세 가지 소유 한정사에 해당합니다. 욕심 모드는 기본 모드와 강제 모드는 표현식 뒤에 ?를 추가하여 표시됩니다. . 소유 모드는 표현식 끝에 +를 추가하여 표시됩니다.
세 가지 모드의 의미는 무엇인가요?
그리디 모드의 의미는 최대한 많은 매치를 맞추면서 동시에 전체 매치를 만족시키려는 것입니다.
리럭턴트 모드의 의미는 최대한 적게 매칭하면서도 전체적인 매칭을 만족시키려는 것입니다.
점유 모드의 의미는 최대한 많이 일치하는 것입니다. 너무 많은 일치로 인해 배열이 일치하지 않는 경우 역행이 발생하지 않습니다.
예를 들어 다음과 같은 문자열이 있습니다.
/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n
그리디 모드의 표현식 매칭:
/m/t.*/nl/n/p/ m
此时匹配结果为 /m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m
저항 패턴 표현 매칭:
/m/t/.*?/nl/n/p/m
此时匹配结果为 /m/t/wd/nl/n/p/m
/m/t /wdx+?/nl/n/p/m
이 경우 일치할 수 없습니다. +는 적어도 하나 이상 일치해야 함을 의미하고 강제 모드는 적어도 하나와 일치해야 하기 때문입니다. , 따라서 일치가 실패합니다.
소유 패턴 표현 일치:
/m/t.*+/nl/n/p/m은 .*가 너무 많은 문자와 일치하므로 현재 일치할 수 없습니다. 나중에 일치하는 것은 불가능합니다.
참고: 변수 일치 규칙에는 강제 수량자 또는 소유 수량자만 사용할 수 있습니다. 예를 들어 X??는 문자 X를 최대한 적게 일치시키는 것을 의미하고, X?는 기본 욕심 모드로 최대한 많이 일치함을 의미합니다. 또 다른 예: X{n}은 n 테마에 맞게 준비해야 하지만 사용하기에 너무 자연스럽다는 의미입니다.
Looking은 이런 경우에 적합합니다. 정규 매칭을 할 때, 특정 표현을 캡쳐(소비)하지 않고, 특정 표현이 있든 없든, 일치하는 부분의 앞 뒤를 알아야 합니다.
lookaround를 사용하지 않고 직접 표현을 사용하여 판단한다면 이렇게 일치하는 표현은 필연적으로 소모될 것입니다.
예: ILoveYou라는 문장을 분할하고 싶다고 가정해 보겠습니다. 원칙적으로 대문자가 나타나면 새로운 단어로 간주됩니다.
일치 규칙을 사용하면 일치하는 대문자가 사용됩니다. 일치 결과는 다음과 같습니다. IL\p{Upper}\p{Lower}*[\p{Upper}]?
You
요구 사항을 충족하지 않습니다.
해결책은 둘러보기를 사용하는 것입니다. 정규식은
출력 결과는 I\p{Upper}?\p{Lower}*(?=[\p{Upper}]?)
Love
You에는 네 가지 유형이 있습니다 둘러보기: (?=X)는 정규식 X가 뒤에 오는 것을 의미합니다. 이전 부분을 일치시킬 때 X 부분은 소비되지 않습니다. , 캡처되지 않습니다. 너비가 0인 순방향 긍정 예측. (?<=X)는 앞 부분이 정규식 X라는 뜻입니다. 뒤 부분을 일치시키면 X 부분이 소비되지 않고 캡쳐되지 않습니다. 너비가 0인 역양성 예측. (?!X)는 뒤에 오는 내용이 정규식 X가 아니라는 뜻입니다. 이전 부분을 일치시키면 X 부분이 소비되지 않고 캡쳐되지 않습니다. 너비가 0인 순방향 부정 예측. (?!=X)는 앞 부분이 정규식 X가 아니라는 의미입니다. 뒤 부분을 일치시키면 X 부분이 소비되지 않고 캡쳐되지 않습니다. 너비가 0인 역방향 부정 예측. 비포획 소유 매칭(?>X) 이는 명확하게 연구된 바가 없습니다.