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

Why does this particular Vim RegEx string work?

我花了一段时间试图缩小一种方法,从几千行以 jpgpng.

结尾的行中仅检索 Web 链接

如果我用

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

我可以很好地抓取链接。几千行被删除并仅由匹配的链接替换。但是如果我删除第一个 \=,就像这里

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

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

如果我将它从模式字符串的末尾删除,它会将每个匹配项连接到一行中。我了解发生这种情况的基本原因(被自己使用)。也就是说,我不知道为什么在这种特定情况下使用时 不会以相同的方式 发生。 (意思是,链接不会堆成一行。)

我的问题是:

从正则表达式的末尾开始,

%s/\n\=

您在每行 0 或 1 \n 中用 // 替换,因此并且由于您 使用 g 标志,因此在任何以任何内容开头的行中但是 \n,将匹配 0 部分,并且不会用任何内容替换任何内容:即该行保持不变。 (齐柏林飞艇报价)

相当于:

:%s/^\n

如果你删除 \=,第一个 \n actually 将被删除,这就是为什么你的 [=40] 末尾的空行和换行符=]non 空行被删除。

现在,这里:

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

\= 使得 any 字符串具有 0 或 1 \(http.*\(jpg\|png\)\) 模式后跟 anything (因为你有\(.*\|\_s\)), 将替换为第一个保存的图案。

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

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

附带说明一下,如果您保存了一个模式但不在替换字符串中使用它,那么您无论如何都会丢失该模式。

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

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

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