정규 표현 식 에서 '포함 되 지 않 음' 을 찾 습 니 다.

로그 분석 작업 을 하려 면 수천 개의 로그 항목 과 자주 접촉 해 야 합 니 다. 방대 한 데이터 양 에서 특정 패턴 의 데 이 터 를 찾기 위해 서 는 복잡 한 정규 표현 식 을 많이 작성 해 야 합 니 다.예 를 들 어 로그 파일 에 특정한 문자열 이 포함 되 어 있 지 않 은 항목 을 들 고 특정한 문자열 로 시작 하지 않 는 항목 을 찾 는 등 이다.
부정 적 전망 사용
정규 표현 식 에는 전망 (Lookahead) 과 회고 (Lookabehind) 라 는 개념 이 있 는데 이 두 용 어 는 정규 엔진 의 일치 행 위 를 매우 형상 적 으로 묘사 하고 있다.주의해 야 할 것 은 정규 표현 식 시계의 앞 과 뒤 가 우리 가 일반적으로 이해 하 는 앞 뒤 와 약간 다르다 는 것 이다.한 단락 의 텍스트 를 우 리 는 일반적으로 텍스트 의 시작 방향 을 '앞' 이 라 고 부 르 고 텍스트 의 끝 방향 을 '뒤' 라 고 부른다.그러나 정규 표현 식 엔진 에 있어 서 는 텍스트 의 머리 에서 꼬리 부분 으로 해석 되 기 때문에 텍스트 의 꼬리 방향 에 대해 서 는 '전' 이 라 고 부 릅 니 다. 이 럴 때 정규 엔진 은 아직 그곳 에 가지 않 았 고 텍스트 의 머리 방향 에 대해 서 는 '후' 라 고 부 릅 니 다. 정규 엔진 이 이미 그곳 을 지 났 기 때 문 입 니 다.다음 그림 에서 보 듯 이:
전망 이란 정규 표현 식 이 특정한 문자 와 일치 할 때 '해석 되 지 않 은 텍스트' 를 미리 보고 일치 / 일치 하지 않 는 지 확인 하 는 것 입 니 다. 뒤 를 돌아 보면 정규 엔진 이 일치 하 는 텍스트 가 일치 / 일치 하지 않 는 지 확인 하 는 것 입 니 다.특정 매 칭 모드 에 부합 되 는 지 안 맞 는 지 우 리 는 긍정 식 매 칭 과 부정 식 매 칭 이 라 고도 부른다.
현대 고급 정규 표현 식 엔진 은 일반적으로 모두 전망 을 지원 합 니 다. 회고 지원 이 광범 위 하지 않 기 때문에 우 리 는 부정적인 전망 으로 우리 의 수 요 를 실현 합 니 다.
이루어지다
테스트 데이터:
2009-07-07 04:38:44 127.0.0.1 GET /robots.txt
2009-07-07 04:38:44 127.0.0.1 GET /posts/robotfile.txt
2009-07-08 04:38:44 127.0.0.1 GET /

예 를 들 어 위의 몇 가지 간단 한 로그 항목 을 우 리 는 두 가지 목 표를 실현 하고 싶 습 니 다.
1. 8 번 데 이 터 를 걸 러 낸다.
2. robots. txt 문자열 이 포함 되 지 않 은 항목 을 찾 아 냅 니 다 (Url 에 robots. txt 가 포함 되 어 있 는 것 만 모두 걸 러 냅 니 다).
전망
(?!    )

특정 문자열 로 시작 하지 않 는 항목 과 일치 하 는 첫 번 째 목 표를 실현 합 니 다.
여기 서 우 리 는 연속 적 인 문자열 을 제외 해 야 하기 때문에 일치 하 는 패턴 은 매우 간단 하 다. 바로 2009 - 07 - 08 이다.다음 과 같이 구현:
^(?!2009-07-08).*?$

Expresso 를 사용 하면 8 번 데 이 터 를 확실히 걸 러 내 는 결 과 를 볼 수 있 습 니 다.
다음은 두 번 째 목 표를 실현 합 니 다. 특정 문자열 을 포함 하 는 항목 을 제외 합 니 다.
우리 가 위 에 쓴 방법 에 따라 나 는 조롱박 을 따라 바 가 지 를 그 렸 다.
^.*?(?!robots\.txt).*?$

이 단락 의 정규 설명 은 다음 과 같다. 첫 번 째 임의의 문 자 를 시작 한 다음 에 뒤에 robots. txt 연속 문자열 을 따 르 지 말고, 그 다음 에 임의의 문자, 문자열 을 따라 끝난다.
테스트 실행 결과:
우리 가 원 하 는 효과 에 이 르 지 못 했다.왜 그 럴 까요?위 에 있 는 정규 표현 식 에 두 개의 캡 처 그룹 디 버 깅 을 추가 합 니 다.
^(.*?)(?!robots\.txt)(.*?)$

테스트 결과:
첫 번 째 그룹 은 아무것도 일치 하지 않 았 고 두 번 째 그룹 은 전체 문자열 과 일치 하 는 것 을 보 았 습 니 다.다시 고 개 를 돌려 아까 그 정규 표현 식 을 잘 분석 해 보 세 요.실제로 정규 엔진 이 A 구역 을 분 석 했 을 때 이미 B 구역 의 전망 작업 을 수행 하기 시작 했다.이때 A 구역 이 Null 일 때 일치 하 는 것 을 발 견 했 습 니 다. * 원래 빈 문자 와 일치 할 수 있 고 전망 조건 이 만족 합 니 다. A 구역 뒤에 로봇 이 아 닌 '2009' 문자열 이 붙 어 있 습 니 다.따라서 전체 일치 과정 이 모든 항목 에 성공 적 으로 일치 합 니 다.
원인 을 분석 한 후에 우 리 는 상술 한 정규 에 대해 수정 을 진행 할 것 이다. *?전망 표현 식 으로 이동 합 니 다. 다음 과 같 습 니 다.
^(?!.*?robots).*$ 

테스트 결과:
Bingo! 
         오늘 은 사이트 의 위 정적 인 규칙 을 작성 합 니 다. 사이트 자 체 를 제외 한 도 메 인 주 소 를 걸 러 내 는 것 이 목적 입 니 다.사이트 가 범 도 메 인 네 임 분석 을 했 기 때문에 IP 주 소 를 입력 하거나 다른 사람 이 도 메 인 네 임 을 서버 의 IP 에 연결 하면 사 이 트 를 방문 할 수 있 습 니 다. 오늘 은 도 메 인 네 임 을 발 견 했 습 니 다. 오 랜 만 에 사용 한 것 같 습 니 다. 이 IP 를 분석 하기 때문에 도 메 인 네 임 을 입력 하면 사이트 에 도착 합 니 다. 해결 방법 은 바로 위 정적 규칙 에서"사이트 도 메 인 이름 을 제외 한 다른 도 메 인 이름 은 모두 걸 러 냅 니 다." 
        "이 사이트 에서 허용 하 는 모든 도 메 인 이름" 을 먼저 쓰 십시오. 정규 표현 식 으로 주요 도 메 인 이름 만 포함 하면 됩 니 다. 앞 에는 2 급 하위 도 메 인 이름 이 있 을 수 있 습 니 다. 그래서 다음 과 같이 썼 습 니 다.
\w+\.k8008\.com\.cn
    접 두 사 를 확장 하면 아래 와 같이 여러 개의 접 두 사 를 허용 합 니 다. 이렇게 하면. com 이나. net,. com. cn 같은 것 이 될 수 있 습 니 다.
\w+\.k8008(\.\w+)+
     그리고 'k8008' 이 포함 되 지 않 은 것 으로 전환 합 니 다. 이것 은 정방 향 예비 검 사 를 사용 해 야 합 니 다. '? =' 은 '?!' 와 같 지 않 습 니 다. 특히 주의해 야 할 것 은 예비 검사 후의 위치 입 니까? 아니면 예비 검 사 를 마 친 문자 부터 찾 는 것 이 아 닙 니 다.
\w+\.(?!k8008)(\.\w+)+
위 에 있 는 이것 은 k8008 을 조사 한 후에 위 치 는 "(?!" 이전의 "\." 에 머 물 렀 고, 이어서 찾 은 것 은 (?! k8008) 뒤의 "\." 입 니 다. 사실 두 개의 점 이 연 결 된 도 메 인 이름 이 없어 서 오류 가 나 서 아무런 결 과 를 얻 지 못 했 습 니 다. 그래서 정규 수첩 N + 1 을 다시 읽 은 후에 다음 과 같은 문장 을 썼 습 니 다.
\w+(?!\.k8008)(\.\w+)+ 
아주 간단 합 니 다. "\." 를 예비 검사 로 옮 기 면 됩 니 다. 마지막 으로 경계 조건 을 더 해 최종 결 과 를 얻 을 수 있 습 니 다.
^\w+(?!\.k8008)(\.\w+)+$
 
 
제 가 원 하 는 것 은 위의 것 과 유사 합 니 다. 사이트 도 광범 위 한 해석 을 지원 하 는 동시에 본 사이트 가 아 닌 xxx. com 의 끝 을 걸 러 내야 합 니 다.
정규 표현 식 은: ^ (?!. *? \. xxx \ \. com). * $
저희 사 이 트 는 abc. xxx. com, abc. xxx. com. cn, www. abc. xxx. com 등 형식 을 지원 합 니 다.

좋은 웹페이지 즐겨찾기