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 \m
jest BRE i \v
jest ERE, z tym że POSIX nie zawiera opisów.
Jeśli taka korespondencja istnieje, czy jest gdzieś zdefiniowana? pattern.txt
ma tylko jedną wzmiankę o POSIX
.
Czy też musimy trzymać się „magii”, aby opisać wyrażenia regularne Vima?
regular-expression
muru
źródło
źródło
\v
są<>
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)Odpowiedzi:
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\v
we wzorze powoduje, że jest on bardziej spójny.:help 'magic'
daje dobre podsumowanie: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 Vimaqu\@!
) odpowiada wzorcowi, poq
którym nie następujeu
. (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ągfoo
nie poprzedzony dokładnie 3 małymi literami”) jest w porządku, ale(?<![a-z]+)foo
(co oznacza, że „ciągfoo
nie 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
\zs
i\ze
. Pozwalają one określić początek i koniec meczu. Na przykładfoo(\zs.*\ze)
dopasowuje tylko to, co znajduje się między(
i)
w wywołaniu funkcji, takim jakfoo(...)
. 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
,foo
lubfood
, wzórf\%[ood]
może być stosowany. W PCRE taki wzór wyglądałbyf(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.
\%23c
dopasowuje kolumnę 23\%<23c
mecze przed kolumną 23\%>23c
mecze po kolumnie 23\%16l
dopasowuje linię 16\%#
dopasowuje pozycję kursoraMyś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.
źródło