Совпадение слова, содержащего символы за пределами a-zA-Z


15

Чтобы соответствовать слову можно использовать

\v(\w+)

Из справки vim :h \w:

\ w символ слова: [0-9A-Za-z_]

Это работает точно так, как описано в руководстве. Тем не менее, я хочу сопоставить слова, которые содержат символы за пределами a-z, например, prästgården . Сопоставление регулярного выражения \v(\w+)с prästgården дает три совпадения:

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

Как сопоставить слова, содержащие символы за пределами a-z? Моя локаль настроена на английский, и, если возможно, я бы хотел, чтобы это так и оставалось.

Изменить: слова могут не принадлежать к одной локали, например

prästgården
treść

Классы символов POSIX (например, [[:alpha:]]\+в данном случае) должны делать то, что вы хотите, но в соответствии с Vim docs ( :help regex) этого не происходит: «Эти элементы работают только для 8-битных символов». Это действительно работает здесь с Vim 7.3 на OS X 10.8, но Vim 7.3 на Linux не работает, поэтому я предполагаю, что в этом Vim есть что-то специфическое для Apple, что позволяет. Вы также обнаружите, что выполнить это через привязку Vim Perl также не удается, хотя Perl имеет очень хорошую поддержку Unicode. Возможно, вам потребуется переключиться на внешний сценарий Perl, чтобы включить полную поддержку Unicode.
Уоррен Янг

Кстати, если вы используете Perl, вы хотите использовать \p{Word}вместо класса символов POSIX. Существует много исключений в обработке Perl-символов POSIX, которых вы избегаете, когда вместо этого используете свойства Unicode.
Уоррен Янг

Ответы:


9

Vim (начиная с версии 7.3) очень ограничен в отношении поддержки не-ASCII символов в шаблонах. В частности, \wсопоставляются только буквы ASCII, что имеет ограниченную полезность.

Существует несколько шаблонов классов символов, которые поддерживают Unicode. Интересны для вас \I, которые по большому счету совпадают буквы и только буквы, плюс _и @. По крайней мере в Debian squeeze (в локали UTF-8) есть ошибки; например, ×и ÷сопоставляются как буквы, но все буквы с латинским акцентом, кажется, распознаются правильно. \Iможно настроить с помощью isidentопции, по крайней мере, для части ASCII.

Если вы хотите серьезную поддержку Unicode, вам нужно полагаться на внешний инструмент. Например, perl -C -e '/\p{L}/'для сопоставления букв UTF-8 (при условии локали UTF-8).



2

Это работает также для кириллицы

\v\k

Немного сложнее и терпит неудачу с кириллицей

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

Док .

Проверено на Vim 7.4.


Я бы добавил [=l=]к списку, который будет охватывать ł(например, złoty) и т. Д. Но это уже не для русского. В любом случае, спасибо, что поделились.
Марко
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.