Vim의 정규식 매직은 잘 알려진 정규식 클래스와 호환됩니까?


16

많은 Unix 도구의 정규 표현식 구문은 종종 POSIX로 코드화 된 기본 및 확장 정규 표현식 (각각 BRE 및 ERE)이며 일부 최신 구현에서는 Perl 스타일 (PCRE가이를 구현 함)입니다.

Vim의 마법 수준과 외부 적으로 정의되었지만 잘 알려진 클래스간에 일대일 대응이 있습니까? POSIX에 둘러보기가 포함되지 않은 것을 제외하고 \m는 BRE 처럼 보이고 \vERE입니다.

그러한 서신이 존재한다면 어딘가에 정의되어 있습니까? pattern.txt에 대한 언급이 하나뿐입니다 POSIX.

아니면 Vim 정규 표현식을 설명하기 위해 "매직"을 고수해야합니까?


3
확신 \v포함 <>AFAIK가 빔에 고유 단어 경계를. 아니, 그냥 "Vim regex"라고 설명하면됩니다. (긍정적이지 않아 답변으로 게시하지 않음)
Doorknob

@Doorknob, 당신은 코멘트로 답변에 대한이 토론을 찾을 수 있다고 생각합니다 . 귀하의 의견에는 3 개의 공감대가 있으며 귀하의 의견이 정확하지 않다고 답변하는 의견이 없기 때문에 아마도 정확하지만 (잘 모르겠 음) 편집 제안 등입니다. 알. 정확도를 향상시킬 수 없습니다. 게시 된 답변으로 정확성 향상, 상향 투표, 하향 투표, 응답 등을 위해 편집 할 수 있습니다.
Wildcard

답변:


22

요약하면, 아닙니다. Vim의 정규식은 독특한 맛이며, 다른 맛처럼 행동하도록하는 옵션은 없습니다.

나는 이것이 좋은 것이라고 생각한다.

마법

'magic'옵션은 Vim이 사용하는 정규식의 맛을 변경하지 않습니다. 단순히 \탈출 한 많은 원자 들의 거동을 뒤집습니다.

예를 들어, 기본적 +으로 리터럴 +문자입니다. 여기서 \+"하나 이상의 선행 원자"를 의미합니다. 대조적으로, *"앞의 원자 중 0 이상"을 의미하는 반면 \*리터럴은 *입니다. 많은 사람들이 이것을 매우 혼란스럽게 생각합니다. 사용 \v하여 패턴으로하면 좀 더 일관성이 있습니다. :help 'magic'좋은 요약을 제공합니다.

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

개인적으로 기본 동작은 코드 파일에 유용 foo(하며 리터럴을 사용하여과 같은 것을 검색하는 것은 드문 일이 아닙니다 (.

Vim 자신의 정규식 맛

나는 Vim이 PCRE를 지원하기를 원하는 많은 사람들을 목격했다. 개인적으로 다른 도구가 Vim의 정규 표현식을 지원하기를 바랍니다. PCRE에서 달성하기에 불가능하거나 너무 성가신 일부 기능이 있습니다.

PCRE에서 불가능

둘러보기 는 패턴을 일치시키려는 패턴 전후에 패턴이 일치하거나 일치하지 않는지 확인할 수있는 일반적인 기능입니다. 예를 들어, PCRE 패턴 q(?!u)(또는 Vim regex 패턴 qu\@!)은 q뒤에 오는 것과 일치 하지 않습니다 u. (이것보다 더 정확하므로 q[^u], 뒤에 약간의 문자 가 필요 합니다 q.)

가변 길이 네거티브 룩백

PCRE 및 기타 여러 가지 향미에는 음의 비하인드 패턴이 고정 길이 여야한다는 제한이 있습니다. 그 말과 같은 패턴 것을 (?<![a-z]{3})foo"문자열을 의미 foo 하지 앞에 정확히 3 소문자 문자")은 잘되어 있지만 (?<![a-z]+)foo( "문자열 의미 foo가 선행되지 숫자 소문자")이 일치하지 않음.

Vim에는이 제한이 없습니다. Vim에서와 같은 패턴은 \([a-z]\+\)\@<!foo보기에는 약간 추악하지만 완벽하게 유효합니다.

Vim 정규식에서 더 쉬움

Vim의 정규 표현식에서 훨씬 더 좋은 점이 있습니다.

경기 시작 및 종료 앵커

가장 눈에 띄는, 내 생각에서입니다 \zs\ze앵커. 이것으로 경기의 시작과 끝을 지정할 수 있습니다. 예를 들어, foo(\zs.*\ze)사이의 유일한 것과 일치 ()같은 함수 호출에 foo(...). 이 작업은 PCRE에서 수행 할 수 있지만 약간의 지루한 둘러보기를 사용해야합니다.(?<=foo\().*(?=\))

접두사 일치

Vim이 할 수있는 또 다른 멋진 일은 특정 문자 시퀀스의 접두사 (빈 접두사 포함)와 일치하는 것입니다. 예를 들어,에 맞게 f, fo, foo, 또는 food패턴이 f\%[ood]사용될 수있다. PCRE에서 이러한 패턴은 다음과 같습니다 f(o(od?)?)?. (더 긴 줄에 대해 상상해보십시오!)

커서, 라인 및 열 위치 일치

Vim의 정규 표현식에는 버퍼의 위치를 ​​일치시키는 앵커가 있습니다.


Vim의 정규식을 맛보는 것이 가치가 있다고 생각합니다. 주로 프로그래밍에 사용되는 텍스트 편집기에서 사용하기에 적합하며 매우 강력합니다.

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