用2号引号之间的加号代替

时间:2014-09-30 10:25:50

标签: regex vim

原始文字就像

  

a = a +" a + b" + c +" a + b" + c

如何在vim中使用regex存档以下结果:

  1. 替换 - 从每对引号中取出+。
  2.   

    a = a - " a + b" - c - " a + b" - c

    1. 代替 - 每对引号中的+。
    2.   

      a = a +" a - b" + c +" a - b" + c

      我尝试使用懒惰或贪婪的乘数来寻找后视并逐步获取结果。但是,我想知道这些是否是对这种情况的一般性陈述,可以使替换清晰而美观。

      谢谢

3 个答案:

答案 0 :(得分:1)

在vim中尝试几个命令:

第一个:

s/\zs+\ze\s*"\|"\s*\zs+\ze/-/g

为第二个:

s/"[^+"]*\zs+\ze[^+"]*"/-/g

答案 1 :(得分:0)

1.: \+(?=(?:[^"\n]*"[^"\n]*")*[^"\n]*$)
2.: \+(?=(?:[^"\n]*"[^"\n]*")*[^"\n]*"[^"\n]*$)

Demo 1. Demo 2.

这个想法很简单:只有在背后有均匀/不均匀数量的引号时才匹配+

第一种模式的解释:

\+ // match "+"
(?= // assert there's an even number of quotes left
    (?:
        [^"\n]*" // consume one quote, and all text in front of it...
        [^"\n]*" //...twice
    )* //...as often as possible
    [^"\n]*$ // finally, assert there's no more quotes in this line.
)

答案 2 :(得分:0)

\+(?=(?:[^"]*"[^"]*")*[^"]*$)

这将是针对第一种情况。如果在+"之间,请排除"。请参阅演示。

http://regex101.com/r/nA6hN9/44

\+(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)

这将是第二种情况。如果在" abd "之间。

参见演示。

http://regex101.com/r/nA6hN9/45