单引号中双引号,反之亦然

问题描述 投票:0回答:5

我经常发现自己颠倒引号:
从双引号

""
到单引号
''

从单引号
''
到双引号
""

我知道有一种方法可以将单引号切换为双引号:

:%s/'\(\([^']*\)\)'/"\1"/g

以及将双引号切换为单引号的方法:

:%s/"\(\([^"]*\)\)"/'\1'/g

但是我如何同时进行这两项操作而不在第二次交换中包含第一个交换的报价?

regex vim quotes
5个回答
6
投票

通常,当您想要像这样交换

A
B
时,您需要一个中间步骤,将
A
替换为完全不同且很可能在文档中唯一的内容,无论是不寻常的字符还是更长的字符还有更疯狂的
|x-monkeyz-x|

然后您可以将所有 B 转换为 As,最后将所有

|x-monkeyz-x|
转换为 B。

例如,

  1. 将所有
    '
    替换为
    !X!
  2. 将所有
    "
    替换为
    '
  3. 将所有
    !X!
    替换为
    "

编辑

这更好:在 Vim 中交换两个字符串出现的最简单方法?


3
投票

如果字符串文字中没有转义引号,则不需要 确保引号配对正确,可以使用命令

:%s/['"]/\="'\""[submatch(0)!='"']/g

3
投票

我通常使用像我的名字这样的中间字符串,不太可能出现在文本中:

  • 将单引号更改为 UNLIKELY_STRING
  • 将双引号更改为单引号
  • 将 UNLIKELY_STRING 更改为双引号

2
投票

使用

\=

:%s/'\([^']*\)'/\='"'.tr(submatch(1), '"', "'").'"'/g

。这假设两个字符仅用作引号,但您的初始代码也执行相同的操作,只是 my 不检查它们是否配对。


0
投票

正如这里有人所说:

:%s/"/*/g | %s/'/"/g | %s/*/'/g

这可以分别通过三个命令来完成。

© www.soinside.com 2019 - 2024. All rights reserved.