Stimmt mit Wörtern überein, die Zeichen jenseits von a-zA-Z enthalten

15

Um ein Wort zu finden, kann man verwenden

\v(\w+)

Aus der Vim-Hilfe :h \w:

\ w Wortzeichen: [0-9A-Za-z_]

Dies funktioniert genau wie im Handbuch beschrieben. Ich möchte jedoch Wörter finden, die darüber hinausgehende Zeichen enthalten a-z, z . B. prästgården . Die Übereinstimmung des regulären Ausdrucks \v(\w+)mit prästgården ergibt stattdessen drei Übereinstimmungen:

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

Wie werden Wörter verglichen, die darüber hinausgehende Zeichen enthalten a-z? Mein Gebietsschema ist Englisch, und wenn möglich, möchte ich es so lassen.

Bearbeiten: Die Wörter gehören möglicherweise nicht zu einem einzelnen Gebietsschema, z

prästgården
treść
Marco
quelle
POSIX-Zeichenklassen (z. B. [[:alpha:]]\+in diesem Fall) sollen hier tun, was Sie wollen, laut Vim docs ( :help regex) jedoch nicht: "Diese Elemente funktionieren nur für 8-Bit-Zeichen." Hier funktioniert es zwar mit Vim 7.3 unter OS X 10.8, aber Vim 7.3 unter Linux funktioniert nicht. Ich gehe also davon aus, dass dieses Vim etwas Apple-spezifisches hat, das es zulässt. Sie werden auch feststellen, dass die Ausführung über die Vim-Perl-Bindung ebenfalls fehlschlägt, obwohl Perl sehr gute Unicode-Unterstützung bietet. Möglicherweise müssen Sie zu einem externen Perl-Skript wechseln, damit Sie die vollständige Unicode-Unterstützung aktivieren können.
Warren Young
Übrigens, wenn Sie sich für Perl entscheiden, möchten Sie \p{Word}anstelle einer POSIX-Zeichenklasse verwenden. Es gibt viele Ausnahmefälle in der POSIX-Zeichenklassenbehandlung von Perl, die Sie vermeiden, wenn Sie stattdessen Unicode-Eigenschaften verwenden.
Warren Young

Antworten:

9

Vim (ab Version 7.3) ist hinsichtlich der Unterstützung von Nicht-ASCII-Zeichen in Mustern sehr eingeschränkt. Insbesondere werden \wnur ASCII-Buchstaben gefunden, was von begrenztem Nutzen ist.

Es gibt einige Zeichenklassenmuster, die Unicode unterstützen. Interessant für Sie sind im \IGroßen und Ganzen Buchstaben und nur Buchstaben plus _und @. Zumindest bei Debian Squeeze (in einem UTF-8-Gebietsschema) gibt es Fehler. Zum Beispiel ×und ÷werden als Buchstaben abgeglichen, aber alle Buchstaben mit lateinischem Akzent scheinen korrekt erkannt zu werden. \Ikann durch die isidentOption zumindest für den ASCII-Teil konfiguriert werden .

Wenn Sie ernsthafte Unicode-Unterstützung wünschen, müssen Sie sich auf ein externes Tool verlassen. Zum Beispiel perl -C -e '/\p{L}/', um UTF-8-Buchstaben abzugleichen (unter der Annahme eines UTF-8-Gebietsschemas).

Gilles 'SO - hör auf böse zu sein'
quelle
2

Es funktioniert auch für Kyrillisch

\v\k

Etwas komplizierter und versagt mit Kyrillisch

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

Doc .

Getestet auf Vim 7.4.

pevik
quelle
Ich würde [=l=]der Liste hinzufügen , die auch ł(z. B. Złoty) usw. abdecken würde . Das scheitert aber schon für Russisch. Trotzdem danke fürs Teilen.
Marco