vim의 정규식 시스템에서 둘러 볼 수 있습니까?


22

vim에서 둘러보기 문을 작성하는 것이 유용한 상황이 많이 발생했습니다. 표준 lookaround 구문 ( (?=), (?!)등 ..)을 사용해 보았지만 vim이 이것을 지원하지 않는 것 같습니다. vim은 이러한 종류의 문장에 대해 동등한 구문을 가지고 있습니까?

답변:


29

"줌"앵커

@ jecxjo의 대답 이외에, 당신은 제로 폭 앵커를 사용할 수있는 여러 상황이 있습니다 \zs\ze대신 긍정적 인 lookaround의는. 이 앵커 는 전체 패턴 내에서 일치 의 시작 ( \zs) 및 끝 ( \ze)을 정의합니다 .

  • foo\zsbarbar앞에 일치 합니다 foo( foo일부 항목이 아님).
  • foo\zebarfoo다음에 일치 합니다 bar( 일치 bar하지 않음)
  • myFunction(\zs.*\ze)함수 호출의 매개 변수와 일치합니다 (시연을 위해 욕심과 비 욕심 일치에 중점을 두지 않습니다)

사용하기

이들은 :substitute명령을 사용할 때 가장 유용합니다 . 예를 들어, I가 함수 호출에서 매개 변수를 대체하고 싶어 말 myFunction()을 가진 foo:

:%s/myFunction(\zs.*\ze)/foo/

이 떠나 myFunction()손상, 당신은 당신의 그들을 캡처에 대해 걱정할 필요가 없습니다 패턴 이나 그들을 반복 교체 .

Vim의 정규 표현식의 lookaround 기능을 사용 하여이 작업을 수행 할 수는 있지만 매우 어수선합니다.

:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/

(이 구문으로 인해 내가 먼저하려고했던 것을 잊게됩니다.)

여전히 둘러보기가 필요합니다

둘러보기가 필요한 상황이 여전히 있습니다. 사용 \zs하고 \ze당신이 간단한 경우를 위해 중대하다 전에 뭔가를 다음 텍스트와 일치하는 다음 후 뭔가 . 그러나 그보다 복잡하면 더 많은 둘러보기 구문을 고수해야 할 것입니다.

재미있는 사실

그것들은 상당히 추악하지만 Vim의 둘러보기는 PCRE보다 훨씬 강력합니다! 그들은 당신이 길이가 일정하지 않는 몇 가지 패턴이 있음을 주장 할 수 있음을 의미, 가변 길이의 음의 lookbehind를 지원 하지 귀하의 경기 전에.

PCRE는 계산 비용이 많이 들기 때문에 이것을 지원하지 않습니다. Vim의 가장 큰 관심사는 아닙니다. 정규 표현식의 가장 일반적인 사용 사례는 계산 시간이 사용자에게 거의 인식되지 않는 대화식 검색을 포함하는 경향이 있기 때문입니다. 그래도 구문 강조에 사용 된 경우이를 알 수 있습니다.

관련 도움말 주제

  • :help \zs
  • :help \ze
  • :help perl-patterns

줌 앵커를 알지 못했습니다. 설명해 주셔서 감사합니다.
EvergreenTree

14

이것이 가능한 것처럼 보입니다. 펄에서 vim으로가는 간단한 테이블이 있습니다.:h perl-patterns

9. Compare with Perl patterns               *perl-patterns*

Vim's regexes are most similar to Perl's, in terms of what you can do.  The
difference between them is mostly just notation;  here's a summary of where
they differ:

Capability                  in Vimspeak   in Perlspeak
----------------------------------------------------------------
force case insensitivity    \c            (?i)
force case sensitivity      \C            (?-i)
backref-less grouping       \%(atom\)     (?:atom)
conservative quantifiers    \{-n,m}       *?, +?, ??, {}?
0-width match               atom\@=       (?=atom)
0-width non-match           atom\@!       (?!atom)
0-width preceding match     atom\@<=      (?<=atom)
0-width preceding non-match atom\@<!      (?<!atom)
match without retry         atom\@>       (?>atom)

예를 들어 문자열이 one two three있고 다음과 같은 one경우에만 일치 시키려면 <space>two다음을 사용할 수 있습니다

/one\(\stwo\)\@=

이것은 펄 버전과 비슷합니다

m/one(?=\stwo)/
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.