为什么这个特定的 Vim RegEx 字符串有效?
Why does this particular Vim RegEx string work?
我花了一段时间试图缩小一种方法,从几千行以 jpg
或 png
.
结尾的行中仅检索 Web 链接
如果我用
%s/\(http.*\(jpg\|png\)\)\=\(.*\|\_s\)//g|%s/\n\=
我可以很好地抓取链接。几千行被删除并仅由匹配的链接替换。但是如果我删除第一个 \=
,就像这里
%s/\(http.*\(jpg\|png\)\)\(.*\|\_s\)//g|%s/\n\=
文件中的任何内容均未更改或删除,并且所有文本都突出显示为匹配项。
如果我将它从模式字符串的末尾删除,它会将每个匹配项连接到一行中。我了解发生这种情况的基本原因(被自己使用)。也就是说,我不知道为什么在这种特定情况下使用时 不会以相同的方式 发生。 (意思是,链接不会堆成一行。)
我的问题是:
为什么第一个示例中的链接保持不变而不是替换整个文件或完全删除?
当 \=
的含义是“ 匹配 0 OR 时,为什么将 \n
指定为可选元素不会删除空值1"?
从正则表达式的末尾开始,
%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
删除所有不具有匹配模式的行。
我花了一段时间试图缩小一种方法,从几千行以 jpg
或 png
.
如果我用
%s/\(http.*\(jpg\|png\)\)\=\(.*\|\_s\)//g|%s/\n\=
我可以很好地抓取链接。几千行被删除并仅由匹配的链接替换。但是如果我删除第一个 \=
,就像这里
%s/\(http.*\(jpg\|png\)\)\(.*\|\_s\)//g|%s/\n\=
文件中的任何内容均未更改或删除,并且所有文本都突出显示为匹配项。
如果我将它从模式字符串的末尾删除,它会将每个匹配项连接到一行中。我了解发生这种情况的基本原因(被自己使用)。也就是说,我不知道为什么在这种特定情况下使用时 不会以相同的方式 发生。 (意思是,链接不会堆成一行。)
我的问题是:
为什么第一个示例中的链接保持不变而不是替换整个文件或完全删除?
当
\=
的含义是“ 匹配 0 OR 时,为什么将\n
指定为可选元素不会删除空值1"?
从正则表达式的末尾开始,
%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
删除所有不具有匹配模式的行。