VIM: 不能完全理解这个替换
VIM: can't fully understand this substitution
我从书中提取了这行代码,将 html 代码格式化为字符串连接形式,以便在 vim 中的 javascript 中使用。我似乎无法理解数字“1”和“2”代表什么以及正则表达式末尾的问号是什么。我习惯于看到像 %s/foo/bar/g 这样的替换,所以没有正斜杠让我有点困惑。总结一下,'1'和'2',美元符号后回车前的问号return,以及为什么不使用正斜杠。
vmap <silent> ;q :s?^\(\s*\)\(.*\)\s*$? + ''?<CR>
正斜杠通常用作分隔符,但替换命令使用 's' 之后的第一个字符作为分隔符,允许将其更改为任何内容。似乎作者认为所有斜线可能会造成混淆,所以将其更改为'?'。这是带有更传统的正斜杠的命令的显示方式:
:s/^\(\s*\)\(.*\)\s*$/ + ''/<CR>
所以上面的意思是,向前搜索,找到以任意数量的空格开头,后跟任意数量的任意字符和任意数量的空格的行,然后将其替换为 <space><the first whitespace><space>+<space>'<the other characters>'
。我认为它打算去除任何尾随空格,但在我的测试中它没有这样做,因为 .* 会将所有内容匹配到行尾。
正如其他答案所说, /
分隔符可以用其他字符代替:当命令中使用很多斜线时,可能会更清楚;看到一个关于它的问题,。
</code>、<code>
、\n...
匹配模式中使用的第 n 个子表达式。子表达式用 \(
和 \)
定义。所以在你的例子中:
:s?^\(\s*\)\(.*\)\s*$? + ''?
\s* --> note that this part can't be reached, it's useless
、</code> 替换为 <code>\(\s*\)
中的空格,
替换为 [=20= 中的所有字符(整行的其余部分) ].
我从书中提取了这行代码,将 html 代码格式化为字符串连接形式,以便在 vim 中的 javascript 中使用。我似乎无法理解数字“1”和“2”代表什么以及正则表达式末尾的问号是什么。我习惯于看到像 %s/foo/bar/g 这样的替换,所以没有正斜杠让我有点困惑。总结一下,'1'和'2',美元符号后回车前的问号return,以及为什么不使用正斜杠。
vmap <silent> ;q :s?^\(\s*\)\(.*\)\s*$? + ''?<CR>
正斜杠通常用作分隔符,但替换命令使用 's' 之后的第一个字符作为分隔符,允许将其更改为任何内容。似乎作者认为所有斜线可能会造成混淆,所以将其更改为'?'。这是带有更传统的正斜杠的命令的显示方式:
:s/^\(\s*\)\(.*\)\s*$/ + ''/<CR>
所以上面的意思是,向前搜索,找到以任意数量的空格开头,后跟任意数量的任意字符和任意数量的空格的行,然后将其替换为 <space><the first whitespace><space>+<space>'<the other characters>'
。我认为它打算去除任何尾随空格,但在我的测试中它没有这样做,因为 .* 会将所有内容匹配到行尾。
正如其他答案所说, /
分隔符可以用其他字符代替:当命令中使用很多斜线时,可能会更清楚;看到一个关于它的问题,
</code>、<code>
、\n...
匹配模式中使用的第 n 个子表达式。子表达式用 \(
和 \)
定义。所以在你的例子中:
:s?^\(\s*\)\(.*\)\s*$? + ''?
\s* --> note that this part can't be reached, it's useless
、</code> 替换为 <code>\(\s*\)
中的空格, 替换为 [=20= 中的所有字符(整行的其余部分) ].