匹配包含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位字符。” 它确实可以在OS X 10.8上的Vim 7.3上运行,但是在Linux上的Vim 7.3不能正常工作,因此我认为该Vim有某些特定于Apple的功能允许它。您还会发现,即使Perl具有很好的Unicode支持,通过Vim Perl绑定执行操作也会失败。您可能需要切换到外部Perl脚本,因此可以打开完整的Unicode支持。
沃伦·杨

顺便说一句,如果您确实使用了Perl,\p{Word}则要使用POSIX字符类代替。Perl的POSIX字符类处理中有很多异常情况,当您改用Unicode属性时可以避免这种情况。
沃伦·杨

Answers:


9

就支持模式中的非ASCII字符而言,Vim(从7.3版开始)非常有限。特别是,\w仅匹配用途有限的ASCII字母。

有一些字符类模式确实支持Unicode。您感兴趣的是\I,它大体上匹配字母和仅字母,加上_@。至少在Debian压缩(在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=]])

Doc

在Vim 7.4上测试。


我将添加[=l=]到涵盖的列表ł(例如złoty)等。但这对于俄罗斯来说已经失败了。无论如何,谢谢分享。
Marco Marco
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.