我从一本书中获取了这行代码,将html代码格式化为字符串连接形式,以便在vim中使用javascript。我似乎无法理解数字' 1'和' 2表示在正则表达式结束时的问号是什么。我曾经常常看到像%s / foo / bar / g 这样的替换,所以没有正斜杠会让我感到困惑。总而言之,我不理解' 1 '和' 2 ',美元符号之后和回车之前的问号,以及为什么不使用正斜杠。
vmap <silent> ;q :s?^\(\s*\)\(.*\)\s*$? \1 + '\2'?<CR>
答案 0 :(得分:1)
正斜杠通常用作分隔符,但替换命令使用's'后面的第一个字符作为分隔符,允许将其更改为任何内容。似乎作者认为所有斜杠都可能令人困惑,因此将其改为“?”。这是命令与更传统的正斜杠一起出现的方式:
:s/^\(\s*\)\(.*\)\s*$/ \1 + '\2'/<CR>
所以上面的意思是,向前搜索,找到以任意数量的空格开头的行,后跟任意数量的任何字符,以及任何数量的空格,然后将其替换为<space><the first whitespace><space>+<space>'<the other characters>'
。我认为它打算删除任何尾随空格,但在我的测试中它没有那样做,因为。*会将所有内容都匹配到行尾。
答案 1 :(得分:0)
正如在其他答案中所说的那样,/
分隔符可以被其他一些字符替换:当命令中使用了很多斜杠时,它可能会更清楚;看到有关它的问题,https://stackoverflow.com/a/36568901/3271687。
\1
,\2
,\n...
匹配模式中使用的 n 子表达式。使用\(
和\)
定义子表达式。所以在你的例子中:
:s?^\(\s*\)\(.*\)\s*$? \1 + '\2'?
\s* --> note that this part can't be reached, it's useless
,\1
替换为\(\s*\)
中的空格,\2
被\(.*\)
中找到的所有字符(整个行的其余部分)替换。