积极的后卫断言和Vim的替代?

时间:2011-11-17 15:40:17

标签: regex vim

我想使用Vim匹配正则表达式并执行替换。我有一个tsv文件,其行如下所示:

rs11223-A        -A
rs23300-G        -TTA
rs9733-T          -G
rs11900000-GT    -TTG

我希望仅在rs ...

之后的第一列中用短划线( - )替换选项卡

在Vim中,我尝试使用以下方式执行替换:

:%s/(?<=^rs[0-9]{1,12})-/\t/g   

有谁可以指出我的问题是什么,并找到正确的解决方案?

4 个答案:

答案 0 :(得分:21)

它可能依赖于配置,但在我的环境中,我必须在{ , }之前添加\

此外,Vim有\zs\ze来开始和结束匹配,因此您通常不需要处理正常的正则表达式外观。

这样做你想要的:

:%s/^rs\d\{1,12}\zs-/\t/g

答案 1 :(得分:8)

使用以下方式完成正面观察:

\@<=

所以你可以使用类似的东西:

:%s/\d\@<=-/\t/g

您的实际数据可能会更复杂,但是根据您发布的内容,您也可以满足于:

:%s/-/\t

如果rs位于该行的开头,您可以使用\zs指定匹配的开头并使用锚定(^):

:%s/^rs\d*\zs-/\t

答案 2 :(得分:0)

您需要以下内容:

%s/^\(rs[0-9]\{1,12\}\)-/\1\t/g

Vim正则表达式需要{}()的一些特殊转义序列。

此外,在替换部分,您需要\1来插入匹配的字符串。

答案 3 :(得分:0)

使用lookbehind的正确表达式是:

%s/\(\d\+\)\@<=-/\t/gc 

\(\d\+\)\@<=表示正向后寻找数字(\d\+表示至少寻找一个数字)。根据{{​​3}},我们必须先捕捉\d\+,然后再应用正面的外观,因此\(\)周围的\d\+

另外,要使用普通的正则表达式+量词,我们必须在vim(\+)中对其进行转义,请参见here