为什么这个特定的Vim RegEx字符串有效?

时间:2015-03-28 07:13:11

标签: regex vim

我花了一段时间试图缩小从仅以jpgpng结尾的几千行检索网络链接的方法。

如果我使用

%s/\(http.*\(jpg\|png\)\)\=\(.*\|\_s\)/\1/g|%s/\n\=

我可以抓住链接就好了。删除了几千行,只用匹配的链接替换。但是,如果我删除第一个\=,就像这里

一样
%s/\(http.*\(jpg\|png\)\)\(.*\|\_s\)/\1/g|%s/\n\=

文件中的任何内容都未被更改或删除,并且所有文本都会突出显示为匹配项。

如果我从模式字符串的末尾删除它,它会将每个匹配连接到一行。我理解为什么会这种情况发生的基本原因(单独使用)。也就是说,在这个特定情况下使用时,我错过了为什么它不会以同样的方式发生。 (意思是,链接不会堆积在一行上。)

我的问题是:

  • 为什么第一个示例中的链接保持不变,而不是替换整个文件或完全删除?

  • 为什么在\n的含义是“匹配0或1 ”时,指定\=作为可选元素不会删除空值?< / b>

1 个答案:

答案 0 :(得分:2)

从正则表达式结束开始,使用

%s/\n\=

你用//代替每一行0或1 \ n,因此你使用g标志,在除了\ n之外的任何行开头的任何行中, 0部分将匹配,没有任何东西将被替换为任何东西:即线条保持不变。 (带齐柏林飞艇的报价)

相当于:

:%s/^\n

如果删除\ =,则会删除每行中找到的第一个\ n 实际,这就是为什么空行和末尾的换行符的原因空行被删除。

现在,在这里:

%s/\(http.*\(jpg\|png\)\)\=\(.*\|\_s\)/\1/g

\ =使任何字符串包含0或1个\(http.*\(jpg\|png\)\)模式,后跟任何(因为您有\(.*\|\_s\)),被第一个保存的模式替换。

基本上,您匹配整个文件并仅阻止此模式:\(http.*\(jpg\|png\)\)被删除。

当您删除\ =时,匹配的0部分会丢弃,并且只有实际具有\(http.*\(jpg\|png\)\)模式的行才会使用本身替换匹配的模式从http到jpg / png,删除之后的任何内容。

另一方面,如果您保存模式但不在替换字符串中使用它,那么无论如何都会丢失该模式。

如果你实际上只想保持 http..jpg / png行并删除其他行,你可以使用g!或v命令:

:v/http.*jpg\|png/d

删除具有匹配模式的所有行。