在vim中使用替换时围绕一个具有特殊字符的组

时间:2017-09-01 20:57:57

标签: regex vim regex-group string-substitution

给定字符串:

 some_function(inputId = "select_something"),
 (...)
 some_other_function(inputId = "some_other_label")

我想到达:

 some_function(inputId = ns("select_something")),
 (...)
 some_other_function(inputId = ns("some_other_label"))

此处的关键更改是 ns( ... ) 元素,它围绕""

之后的inputId中可用的字符串

的正则表达式

到目前为止,我已经提出了这个正则表达式:

:%substitute/\(inputId\s=\s\)\(\"[a-zA-Z]"\)/\1ns(/2/cgI

但是,部署时会产生错误:

  

E488:尾随字符

该正则表达式的一个更简单的版本可以使用,语法:

:%substitute/\(inputId\s=\s\)/\1ns(/cgI
找到ns(并创建字符串

后,

会正确插入 inputId =

some_other_function(inputId = ns("some_other_label")

挑战

我努力匹配字符串的剩余部分,例如。 "select_something")并将其返回为:  

"select_something"))

2 个答案:

答案 0 :(得分:1)

你的正则表达式有很多问题。

  1. [a-zA-Z]只会匹配一个字母。大概你想要匹配下一个"的所有内容,所以你需要一个\+,你也需要匹配下划线。我建议\w\+。除非字符串中可能超过[a-zA-Z_],否则我会.\{-}

  2. 您有/2而不是\2。这就是为什么你得到 E488

  3. 我会这样做:

    :%s/\(inputId = \)\(".\{-}\)"/\1ns(\2)/cgI
    

    或使用开始匹配原子:(即\zs

    :%s/inputId = \zs\".\{-}"/ns(&)/cgI
    

答案 1 :(得分:1)

您可以使用否定字符类"[^"]*"来匹配带引号的字符串:

%s/\(inputId\s*=\s*\)\("[^"]*"\)/\1ns(\2)/g