[regex] 아무것도 일치하지 않는 정규식

이것은 어리석은 질문처럼 들릴지 모르지만 동료 개발자들과 오랫동안 이야기를 나누었으며 재미있는 생각처럼 들렸습니다.

그래서; 당신의 생각은 무엇입니까-Regex는 어떻게 생겼으며, 어떤 문자열과도 일치하지 않습니다!

편집 : 왜 내가 이것을 원합니까? 글쎄, 첫 번째는 그런 표현을 생각하는 것이 흥미롭고 두 번째는 스크립트에 필요하기 때문입니다.

그 스크립트에서 나는 사전을 다음과 같이 정의합니다. Dictionary<string, Regex> . 여기에는 문자열과 표현식이 포함되어 있습니다.

해당 사전을 기반으로 모든 사람이 작업을 수행하는 방법에 대한 참조로만이 사전을 사용하는 메소드를 작성합니다.이 중 하나는 구문 분석 된 로그 파일에 대한 정규식과 일치합니다.

식이 일치하면 다른 식 Dictionary<string, long> 하면 식에 의해 반환되는 값이 추가됩니다. 따라서 사전의 식과 일치하지 않는 로그 메시지를 포착하기 위해 “unknown”이라는 새 그룹을 만들었습니다.

이 그룹에는 다른 것과 일치하지 않는 모든 것이 추가됩니다. 그러나 “알 수없는”식이 실수로 로그 메시지와 일치하지 않도록하려면 문자열에 관계없이 가장 확실하게 일치하지 않는 식을 만들어야했습니다.

따라서, 당신은이 “진짜 질문이 아닙니다”에 대한 나의 이유가 있습니다 …



답변

구현 / 플래그 * 에 따라 다르지만 실제로는 매우 간단합니다 .

$a

a문자열 끝 이후의 문자와 일치 합니다. 행운을 빕니다.

경고 :
이 표현식은 비용이 많이 듭니다. 전체 행을 스캔하고 행 끝 앵커를 찾은 다음에 만 a일치하는 값을 찾지 못하고 리턴합니다. (자세한 내용은 아래 주석을 참조하십시오.)


* 원래 나는 줄 $의 끝과도 일치하는 멀티 라인 모드 정규 표현식에 대해 많이 생각하지 않았습니다 . 실제로, 그것은 개행 직전 의 빈 문자열과 일치 하므로 일반 문자는 a뒤에 나타날 수 없습니다 $.


답변

활용 negative lookahead:

>>> import re
>>> x=r'(?!x)x'
>>> r=re.compile(x)
>>> r.match('')
>>> r.match('x')
>>> r.match('y')

이 RE는 용어의 모순이므로 절대로 일치하지 않습니다.

참고 :
Python에서 re.match ()\A 는 정규 표현식의 시작 부분에 문자열 시작 앵커 ( )를 암시 적으로 추가합니다 . 이 앵커는 성능에 중요합니다.이 앵커가 없으면 전체 문자열이 스캔됩니다. 파이썬을 사용하지 않는 사람들은 앵커를 명시 적으로 추가하려고합니다.

\A(?!x)x


답변

놓친 것 :

^\b$

빈 문자열에 단어 경계가 없기 때문에 일치하지 않습니다. 파이썬 2.5에서 테스트되었습니다.


답변

둘러보세요 :

(?=a)b

정규 표현식 초보자의 경우 : 긍정적 인 모습 (?=a)은 다음 문자가 a이지만 검색 위치를 변경하지는 않습니다 (또는 일치하는 문자열에 ‘a’포함). 이제 다음 문자가 확인 a되었으므로 b다음 문자가있는 경우에만 정규식 ( ) 의 나머지 부분이 일치합니다 b. 따라서이 정규 표현식은 문자가 모두있는 경우에만 일치 ab동시에.


답변

a\bc여기서 \b단어 경계와 일치하는 너비가 0 인 표현식입니다.

그것은 단어의 한가운데서 나타날 수 없으며, 우리는 그것을 강요합니다.


답변

$.

.^

$.^

(?!)


답변

최대 매칭

a++a

역 추적없이 최소 하나 a뒤에 임의의 숫자가옵니다 a. 그런 다음 하나 더 일치 시키십시오 a.

또는 독립적 하위 표현

이것은 a+독립적 인 하위 표현식을 입력 한 다음 다른 하위 표현식을 입력하는 것과 같습니다 a.

(?>a+)a