[regex] 정규식과 “역 일치”하는 방법은 무엇입니까?

나는 RegexBuddy를 사용하고 있지만 어쨌든이 일에 문제가 있습니다 : \

한 줄씩 파일을 처리하고 있습니다. 내가 원하는 것과 일치하는 “라인 모델”을 만들었습니다.

이제 역 일치를하고 싶습니다. 즉, 6 개의 문자가있는 줄을 일치시키고 싶지만이 6 개의 문자가 Andrea아닌 경우에만 어떻게해야합니까?


편집 : 이 정규식을 사용하는 프로그램을 작성할 것입니다 .python 또는 php에서 정규식을 배우기 위해 먼저이 일을하고 있습니다. 🙂 다른 유형 의 줄이 있습니다. 정규식을 사용하고 싶었습니다. 관심있는 유형을 선택합니다.이 라인을 확보 한 후에는 알려진 값과 일치하지 않도록 다른 필터를 적용해야합니다. 다른 모든 필터가 필요합니다. (?! 원하지 않음)이 꽤 잘 작동합니다. 감사합니다. 🙂

나는 이것이 질문을 명확히하기를 바랍니다. 🙂



답변

(?!Andrea).{6}

정규식 엔진이 부정적인 예측을 지원한다고 가정합니다.

편집 : .. 또는 [A-Za-z]{6}대신 사용하고 싶을 수도 있습니다..{6}

편집 (다시) : 예견과 예후는 일반적으로 정규식 일치를 “반전”하는 올바른 방법이 아닙니다. 정규 표현식은 실제로 네거티브 매칭을 수행하도록 설정되어 있지 않으며 사용하는 언어에 관계없이 그대로 둡니다.


답변

Python / Java의 경우

^(.(?!(some text)))*$

http://www.lisnichenko.com/articles/javapython-inverse-regex.html


답변

Alan Moore의 피드백으로 업데이트 됨

PCRE 및 유사한 변형에서 실제로 값을 포함하지 않는 모든 행과 일치하는 정규식을 만들 수 있습니다.

^(?:(?!Andrea).)*$

이를 강화 된 탐욕스러운 토큰 이라고합니다 . 단점은 성능이 좋지 않다는 것입니다.


답변

어떤 언어를 사용하고 있습니까? 정규식 구현의 기능과 구문이이를 위해 중요합니다.

미리보기를 사용할 수 있습니다. 예제로 파이썬 사용

import re

not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)

그것을 분해하려면 :

(?! Andrea) 는 ‘다음 6 개의 문자가 “Andrea”가 아닌 경우 일치’를 의미합니다. 그렇다면

\ w 는 “단어 문자”-영숫자 문자를 의미합니다. 이것은 [a-zA-Z0-9_] 클래스와 동일합니다.

\ w {6} 는 정확히 6 개의 단어 문자를 의미합니다.

re.IGNORECASE 는 “Andrea”, “andrea”, “ANDREA”를 제외한다는 의미입니다. …

또 다른 방법은 프로그램 논리를 사용하는 것입니다. Andrea와 일치하지 않는 모든 줄을 사용하고 두 번째 정규식을 통해 6자를 확인합니다. 또는 먼저 최소 6 개의 단어 문자를 확인한 다음 Andrea와 일치하지 않는지 확인하십시오.


답변

부정적인 예견 주장

(?!Andrea)

이것은 정확히 반전 된 일치는 아니지만 정규식으로 직접 수행 할 수있는 최선의 방법입니다. 하지만 모든 플랫폼이이를 지원하는 것은 아닙니다.


답변

RegexBuddy에서이 작업을 수행하려면 정규식과 일치하지 않는 모든 행의 목록을 가져 오는 두 가지 방법이 있습니다.

테스트 패널의 도구 모음에서 테스트 범위를 “줄 단위”로 설정합니다. 이렇게하면 같은 도구 모음의 모두 나열 단추 아래에 일치하지 않는 모든 줄 나열 항목이 나타납니다. (모두 나열 단추가 보이지 않으면 주 도구 모음에서 일치 단추를 클릭하십시오.)

GREP 패널에서 “line-based”및 “invert results”확인란을 설정하여 검색중인 파일에서 일치하지 않는 라인 목록을 가져올 수 있습니다.


답변

(?!실제로 유용합니다. 엄밀히 말하면 앞을 내다 보는 것은 수학적으로 정의 된 정규식이 아닙니다.

반전 정규식을 수동으로 작성할 수 있습니다.

다음은 결과를 자동으로 계산 하는 프로그램 입니다. 그 결과는 기계에서 생성되며 일반적으로 손으로 쓰는 것보다 훨씬 더 복잡합니다. 그러나 결과는 작동합니다.