【问题标题】:Double quotes in single quotes and vice versa单引号中的双引号,反之亦然
【发布时间】:2012-04-25 03:51:13
【问题描述】:

我经常发现自己反引号:
从双引号 "" 到单引号 ''
从单引号 '' 到双引号 @987654324 @

我知道有一种方法可以将单引号切换为双引号:
:%s/'\(\([^']*\)\)'/"\1"/g

还有一种将双引号切换为单引号的方法:
:%s/"\(\([^"]*\)\)"/'\1'/g

但我如何一起进行这两项操作,而不在第二次交换中包含第一个交换的引号?

【问题讨论】:

  • 在单个命令中使用哈希映射替换多个单词:%s/\/\={'foo':'bar' ,'bar':'baz','baz':'foo'}[submatch(0)]/gc .. 这里 foo -> bar, bar -> baz, baz -> foo.

标签: regex vim quotes


【解决方案1】:

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

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

【讨论】:

  • `@ib,转义引号是什么意思?您的正则表达式也适用于您自己的正则表达式(带有转义引号?) - btw tnx :)
  • @Remonn:我的意思是在您操作的文本中引用转义语法。如果您在 Vim 脚本字符串文字上运行这些替换,那么 "one\"two" 将更改为 'one\'two',它与原始文字表示的字符串不同。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    通常,当您想像这样交换 AB 时,您需要一个中间步骤,将 A 替换为完全不同的东西,并且很可能在文档中是唯一的,无论是不寻常的字符还是更长更疯狂的东西,比如|x-monkeyz-x|

    然后您可以将所有 B 转换为 As,最后将所有 |x-monkeyz-x| 转换为 B。

    例如,

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

    编辑

    这样更好:Easiest way to swap occurrences of two strings in Vim?

    【讨论】:

      【解决方案4】:

      使用\=:

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

      。这假定这两个字符都只用作引号,但您的初始代码也做同样的事情,除了 my 不检查它们是否配对。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 2011-11-17
        • 2017-12-07
        相关资源
        最近更新 更多