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= 中的所有字符(整行的其余部分) ].