Czy magia wyrażeń regularnych Vima jest kompatybilna ze znanymi klasami wyrażeń regularnych?

16

Wiele składni wyrażeń regularnych wielu narzędzi uniksowych to często podstawowe i rozszerzone wyrażenia regularne zakodowane w POSIX (odpowiednio BRE i ERE), aw niektórych współczesnych implementacjach styl Perl (PCRE jest implementacją tego).

Czy istnieje zgodność jeden-do-jednego między poziomami magii Vima a tak zdefiniowanymi zewnętrznie, ale dobrze znanymi klasami? Wygląda na to, że \mjest BRE i \vjest ERE, z tym że POSIX nie zawiera opisów.

Jeśli taka korespondencja istnieje, czy jest gdzieś zdefiniowana? pattern.txtma tylko jedną wzmiankę o POSIX.

Czy też musimy trzymać się „magii”, aby opisać wyrażenia regularne Vima?

muru
źródło
3
Całkiem pewne \v<>granice słów, które AFAIK jest unikalny dla Vima. Więc nie, po prostu opisz je jako „Wyrażenie regularne Vima”. (Nie publikuję jako odpowiedzi, ponieważ nie jestem pozytywny)
Klamka
@Doorknob, myślę, że ta dyskusja odpowiedzi jako komentarzy może być dla Ciebie interesująca. Ponieważ twój komentarz ma trzy pozytywne opinie i nie ma komentarzy, które mówią, że jest niepoprawny, prawdopodobnie jest poprawny (nie jestem pewien), ale sugerował edycję et. glin. nie można poprawić jego dokładności. Jako opublikowaną odpowiedź można go edytować w celu zwiększenia dokładności, przegłosować, przegłosować, odpowiedzieć itp.
Wildcard

Odpowiedzi:

22

Podsumowując, nie. Wyrażenie regularne Vima jest unikalnym smakiem i nie ma opcji, aby zachowywał się bardziej jak inny smak.

Myślę, że to dobra rzecz.

magia

Ta 'magic'opcja nie zmienia smaku wyrażenia regularnego używanego przez Vima. Po prostu odwraca zachowanie wielu \atomów.

Na przykład domyślnie +jest literalnym +znakiem, gdzie \+oznacza „jeden lub więcej z poprzedniego atomu”. Natomiast *oznacza „zero lub więcej poprzedniego atomu”, podczas gdy \*jest dosłowne *. Wiele osób uważa to za dość mylące. Zastosowanie \vwe wzorze powoduje, że jest on bardziej spójny. :help 'magic'daje dobre podsumowanie:

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'

Osobiście uważam, że domyślne zachowanie jest dobre w przypadku plików kodu, w których nierzadko szuka się czegoś takiego foo(, jak użycie literału (.

Smak regexowy Vima

Byłem świadkiem wielu osób, które chciałyby, żeby Vim wspierał PCRE. Osobiście chciałbym, aby inne narzędzia wspierały smak wyrażenia regularnego Vima. Ma pewne możliwości, które są niemożliwe lub zbyt uciążliwe do osiągnięcia w PCRE.

Niemożliwe w PCRE

Lookaround to wspólna funkcja, w której można stwierdzić, że wzorzec jest zgodny lub nie pasuje przed lub po wzorcu, który próbujesz dopasować. Na przykład wzorzec PCRE q(?!u)(lub wzorzec regularny Vima qu\@!) odpowiada wzorcowi, po qktórym nie następuje u. (Jest to bardziej poprawne niż q[^u], które wymaga, aby po znaku była jakaś postać q).

Negatywny wygląd za zmienną długością

PCRE i wiele innych smaków ma ograniczenie, że negatywny wzór za wyglądem musi mieć określoną długość. Oznacza to, że wzorzec typu (?<![a-z]{3})foo, oznaczający „ciąg foo nie poprzedzony dokładnie 3 małymi literami”) jest w porządku, ale (?<![a-z]+)foo(co oznacza, że ​​„ciąg foonie poprzedzony żadną liczbą małych liter”) nie jest w porządku .

To ograniczenie nie istnieje w Vimie. W Vimie wzór \([a-z]\+\)\@<!foo, choć może trochę brzydki, jest całkowicie poprawny.

Łatwiej w wyrażeniu regularnym Vima

Niektóre rzeczy są o wiele ładniejsze w smaku wyrażeń regularnych Vima.

Początek i koniec kotwic zapałek

Moim zdaniem najbardziej godne uwagi są kotwice \zsi \ze. Pozwalają one określić początek i koniec meczu. Na przykład foo(\zs.*\ze)dopasowuje tylko to, co znajduje się między (i )w wywołaniu funkcji, takim jak foo(...). Można to zrobić w PCRE, ale wymaga użycia lookaround, co jest nieco uciążliwe:(?<=foo\().*(?=\))

Dopasowywanie prefiksów

Kolejną fajną rzeczą, którą Vim może zrobić, jest dopasowanie dowolnego prefiksu (w tym pustego prefiksu) określonej sekwencji znaków. Na przykład, aby dopasować na f, fo, foolub food, wzór f\%[ood]może być stosowany. W PCRE taki wzór wyglądałby f(o(od?)?)?. (Wyobraź to sobie na dłuższy ciąg!)

Dopasowywanie pozycji kursora, linii i kolumny

Wyrażenie regularne Vima zawiera pewne kotwice do dopasowywania pozycji w buforze.


Myślę, że warto poświęcić Vimowi smak wyrażenia regularnego. Jest dobrze przystosowany do użycia w edytorze tekstu używanym głównie do programowania i jest dość wydajny.

tommcdo
źródło