테스트 데이터:
예를 들어, 위의 간단한 로그 항목의 경우 두 가지 목표를 달성하려고 합니다.
1. 8번 항목을 필터링합니다. robots.txt를 포함하지 않는 문자열 항목이 발견되었습니다(URL에 robots.txt가 포함되어 있으면 필터링됩니다).
lookahead의 구문은 다음과 같습니다.
(?!匹配模式)
먼저 첫 번째 목표, 즉 특정 문자열로 시작하지 않는 항목을 일치시키는 것을 달성해 보겠습니다.
여기에서는 연속된 문자열을 제외하려고 하므로 일치 패턴은 매우 간단하며 2009-07-08입니다. 구현은 다음과 같습니다.
^(?!2009-07-08).*?$
Expresso를 사용하면 결과가 실제로 8번의 데이터를 필터링하는 것을 확인할 수 있습니다.
다음으로 두 번째 목표인 특정 문자열이 포함된 항목을 제외해 보겠습니다.
위에서 작성한 방식에 따라 살펴보았습니다.
^.*?(?!robots\.txt).*?$
이 정규 규칙을 현지어로 설명하면 다음과 같습니다. 임의의 문자로 시작하고 robots.txt의 연속된 문자열을 따르지 말고 그런 다음 임의 개수의 문자 뒤에 문자가 옵니다. 문자열의 끝입니다.
테스트를 실행한 결과:
원하는 효과를 얻지 못했습니다. 왜 이런가요? 디버깅을 위해 위 정규식에 두 개의 캡처 그룹을 추가해 보겠습니다.
^(.*?)(?!robots\.txt)(.*?)$
테스트 결과:
첫 번째 그룹은 아무것도 일치하지 않지만 두 번째 그룹은 전체 문자열과 일치합니다. 이제 다시 돌아가서 정규 표현식을 분석해 보겠습니다.
실제로 일반 엔진이 A 영역을 구문 분석할 때 이미 B 영역에 대한 예측 작업을 수행하기 시작했습니다. 이때 A 영역이 Null - .* 이면 원래 Null 문자 일치가 허용되고, A 영역 바로 다음에 로봇이 아닌 문자열 "2009"가 만족되었을 때 일치가 성공한 것으로 확인되었습니다. 따라서 전체 일치 프로세스는 모든 항목을 성공적으로 일치시킵니다.
이유를 분석한 후 다음과 같이 위의 정규 표현식을 수정하고 .*?를 예측 표현식으로 이동했습니다.
^(?!.*?robots).*$
테스트 결과:
추천 튜토리얼:
Java 소개 개발위 내용은 Java는 정규식을 사용하여 특정 규칙을 포함하지 않는 문자열을 일치시킵니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!