2014-01-15 6 views
14

Vim에서 일치하는 행을 검색하는 방법이 있습니까? abc이지만 나중에 행에 xyz이 포함되어 있지 않습니까?vim regex에서 negative lookahead를 수행하는 방법이 있습니까?

The abc is the best 
The first three letters are abc 

을하고 다음이 일치하지 않을 : 그래서 다음과 같은 라인이 일치합니다

/abc\(xyz\)\@! 

abcxyz 일치하는 것을 피한다 있고 :

The abc is the best but xyz is cheaper 
The first three letters are abc and the last are xyz 

나는 다음과 같은 구문에 대해 알고 사이에 아무 것도없는 경우가 없습니다 (예 : abc-xyz). 나중에 xyz이 일치하지 않는 라인에 많은 위치가 있기 때문에 또한

/abc.*\(xyz\)\@! 

를 사용하면 작동하지 않습니다.

은 (내가 grep abc <infile | grep -v xyz 같은 것을 할 것이다 명령 행에서 점에 유의해야하지만 빔에 대화 형으로 위의 작업을 수행하고 싶습니다.)

답변

21

귀하의 시도가 꽤 가까이 나를 위해 작동 ; 당신은 당겨 에 필요한 .* 부정적인보기 미리로 원정 주장 나중에 비 일치 사이의 임의의 거리를 수 :

/abc\(.*xyz\)\@! 

나는 비 일치를 시도하기 때문에이 작품 같아요 .*의 가능한 모든 일치 항목에 대해 모든 분기가 모두 소모 된 경우에만 \@!이 충족 됨으로 선언됩니다.

+1

이 ABC '에 해당이 (?!. * XYZ)'펄 같은 엔진이다. – nhahtdh

+0

Look-Ahead Simple은 패턴의 현재 위치에서 또 다른 본격적인 검색을 시작하고 그 결과를 사용하여 계속 진행할지 여부를 결정합니다 (미리보기가 양수인지 음수인지에 따라 다름). – nhahtdh

+1

도': help perl-patterns'을 참조하십시오. 'pattern1'이 선행되지 않는'pattern2'의 경우, 그것은 음수의 look-behind입니다.'\ (pattern1 \) \ @ hochl

0

나는 내가이 (내가 한 번만 각 위치를 테스트 이후가 될 것 같아요) 다른 제안보다 더 빨리인지 확실하지 않다 /abc\(\(xyz\)\@!.\)*$

로이 쓰기 거라고 생각하지만 개념적인 의미로한다 :

"XYZ가 아닌 것은 다음에 abc 방송, 라인이 끝날 때까지 여러 번"내가 좋아하는

그 "아무것도 다음에 ABC XYZ 다음에하지"언급 된 다른 패턴으로보다.

1

귀하의 질문은 lookahead에 관한 것이지만, 나는 lookbehind를 검색하는 동안 그것을 발견했습니다. 따라서, 나는 다른 사람들이 그것을 찾을 수 있도록 lookbehind에 대한 해결책을 게시한다.

pattern1가 선행되지 pattern2를 검색 할 경우, 즉 부정적인 lookbehind, 검색입니다 :

\(pattern1\)\@<!pattern2