답변:
@ jecxjo의 대답 이외에, 당신은 제로 폭 앵커를 사용할 수있는 여러 상황이 있습니다 \zs
및 \ze
대신 긍정적 인 lookaround의는. 이 앵커 는 전체 패턴 내에서 일치 의 시작 ( \zs
) 및 끝 ( \ze
)을 정의합니다 .
foo\zsbar
bar
앞에 일치 합니다 foo
( foo
일부 항목이 아님).foo\zebar
foo
다음에 일치 합니다 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
이것이 가능한 것처럼 보입니다. 펄에서 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)/