在vim中反转regexp

时间:2010-03-24 15:49:47

标签: regex vim

在Stack Overflow上有一些“我如何反转正则表达式”的问题,但我找不到一个用于vim(如果确实存在,我的Google-fu今天缺乏)。

本质上我想匹配所有不可打印的字符并删除它们。我可以编写一个简短的脚本,或者删除一个shell并使用tr或类似的东西来删除,但是一个vim解决方案就是花花公子: - )

Vim有原子\p来匹配可打印字符,但尝试执行此操作:s/[^\p]//g以匹配逆转失败,只留下文件中的每个'p'。我在其他问题中看到了(?!xxx)序列,而vim似乎无法识别这个序列。我没有找到一个原子用于不可打印的字符。

在此期间,我将放弃使用外部工具,但如果有人为此做了任何伎俩,那么欢迎: - )

的Ta!

3 个答案:

答案 0 :(得分:10)

不幸的是,你不能把\p放在角色类中,尽管这是一个很好的功能。但是,您可以使用否定前瞻功能\@!来构建搜索:

/\p\@!.

这将首先确保.只有在不是\p字符时才能匹配。

答案 1 :(得分:1)

我也有点不解为什么你不能使用\ p。但是,[:print:]工作正常:

:s/[^[:print:]]//g

答案 2 :(得分:1)

如果要使用Unicode(仅限fileencoding = utf-8)可打印字符过滤文件,可以分三步执行此操作:使用未使用的UTF-8符号标记所有可打印字符(例如,使用{{1删除所有未跟随此符号的字符,最后删除此符号:

nr2char(0xFFFF)

在此,您必须将%s/\p\@<=/<ffff>/g %s/[^<ffff>]<ffff>\@!//g %s/<ffff>//g 替换为实际字符(如果您输入此字符,而不是<ffff>类型<ffff>)。

如果您不使用Unicode,请使用dsummersl的答案。