Dopasuj słowo zawierające znaki spoza a-zA-Z

15

Aby dopasować słowo, można użyć

\v(\w+)

Z pomocy vima :h \w:

\ w znak słowny: [0-9A-Za-z_]

Działa to dokładnie tak, jak opisano w instrukcji. Chcę jednak dopasować słowa zawierające znaki poza a-z, np . Prästgården . Dopasowanie wyrażenia regularnego \v(\w+)do prästgården daje zamiast tego trzy dopasowania:

prästgården
^^ ^^^ ^^^^

Jak dopasować słowa zawierające znaki poza nimi a-z? Moje ustawienia regionalne są ustawione na angielski i jeśli to możliwe, chciałbym, żeby tak było.

Edycja: słowa mogą nie należeć do jednego ustawienia narodowego, np

prästgården
treść
Marco
źródło
Klasy znaków POSIX (np. [[:alpha:]]\+W tym przypadku) powinny robić to, co chcesz tutaj, ale zgodnie z Vim docs ( :help regex) nie działa: „Te elementy działają tylko dla znaków 8-bitowych”. Zdarza się, że działa tutaj z Vimem 7.3 na OS X 10.8, ale Vim 7.3 na Linuksie nie działa, więc zakładam, że jest coś specyficznego dla Apple w tym Vimie, który na to pozwala. Przekonasz się również, że robienie tego przez wiązanie Vima Perla również kończy się niepowodzeniem, mimo że Perl ma bardzo dobrą obsługę Unicode. Konieczne może być przejście na zewnętrzny skrypt Perla, aby można było włączyć pełną obsługę Unicode.
Warren Young,
Nawiasem mówiąc, jeśli korzystasz z Perla, chcesz użyć \p{Word}zamiast klasy znaków POSIX. Istnieje wiele wyjątków w obsłudze klasy znaków POSIX w Perlu, których można uniknąć, gdy zamiast tego używa się właściwości Unicode.
Warren Young,

Odpowiedzi:

9

Vim (od wersji 7.3) jest bardzo ograniczony pod względem obsługi znaków we wzorcach spoza ASCII. W szczególności \wpasuje tylko do liter ASCII, co ma ograniczoną przydatność.

Istnieje kilka wzorców klas znaków, które obsługują Unicode. Interesujące Cię są \I, które zasadniczo pasują do liter i tylko liter, plus _i @. Przynajmniej w przypadku ściśnięcia Debiana (w lokalizacji UTF-8) występują błędy; na przykład ×i ÷są dopasowane do liter, ale wszystkie litery z akcentami łacińskimi wydają się być rozpoznawane poprawnie. \Imożna skonfigurować za pomocą isidentopcji, przynajmniej dla części ASCII.

Jeśli chcesz poważnie wspierać Unicode, musisz polegać na zewnętrznym narzędziu. Na przykład, perl -C -e '/\p{L}/'aby dopasować litery UTF-8 (przy założeniu ustawień regionalnych UTF-8).

Gilles „SO- przestań być zły”
źródło
3

Zastosowanie \k. Zobacz iskeywordopcję.

Hans Ginzel
źródło
2

Działa również dla cyrylicy

\v\k

Trochę bardziej skomplikowane i nie działa z cyrylicą

\v(\c[0-9a-z_[=a=][=c=][=e=][=i=][=l=][=n=][=o=][=r=][=s=][=t=][=u=][=y=][=z=]])

Doc .

Testowane na Vimie 7.4.

pevik
źródło
Dodałbym również [=l=]do listy, która obejmowałaby ł(np. Złoty) itp. Ale to już nie udaje się rosyjskiemu. W każdym razie dzięki za udostępnienie.
Marco