在gvim中搜索括号并在其前加上反斜杠

4

我是Vim的新手,请帮忙搜索并将\添加到字符串中。

例如,对于 [1][sometest & numbers][7],输出应该是 [1]\[sometest & numbers\][7]

我可以使用以下方法来更改开放的括号[

:%s/\[[a-z]\&\[/\\\[/g

但是我无法为] (右括号)完成它。

[1]\[某些测试和数字\][7]。 - swarak
2个回答

2
为了匹配任何不属于 [<DIGITS_HERE>] 子字符串的 ][,您可以使用:
:%s/\v\[(\d+])@!|(\[\d+)@<!]/\\&/g

在这里,

  • \v - 打开非常魔法模式
  • \[(\d+])@! - 一个 [ 字符后面不跟随1个或多个数字然后是 ]
  • | - 或者
  • (\[\d+)@<!] - 一个 ] 字符不是紧接着前面的 [ 和1个或多个数字
  • /\\& - 将匹配项替换为 \ 和找到的匹配项
  • /g - 全局。

谢谢回复,唯一的问题是中间字符串也包含数字。 意思是 [1][hello12hi[7] 这样,按照您的建议,它不会在这个字符串中添加 \。 - swarak
@swarak 尝试另一个解决方案:它只是确保匹配的 [] 不是 [<DIGITS>] 子字符串的一部分。 - Wiktor Stribiżew
非常感谢您,先生。它起作用了,您不知道我为了弄清楚这个问题已经痛苦了多久,几乎试了一整天。我有一个包含数千行的文件,但是使用这个工具只需要几秒钟就完成了。再次感谢您,先生。请问我在哪里可以学习更多关于正则表达式和gvim的知识?您能提供书籍或链接建议吗? - swarak
@swarak 这份 Vim 正则表达式文档(http://vimdoc.sourceforge.net/htmldoc/pattern.html)非常不错。还有其他很好的资源,比如 https://vim.fandom.com/wiki/Regex_lookahead_and_lookbehind。 - Wiktor Stribiżew

0

那么这里的基本思路是将字符串分割成若干部分:

[1][sometest & numbers][7]

可以分成:

  1. [1]
  2. [
  3. 一些测试和数字
  4. ]
  5. [7]

然后你可以通过将第1部分 + \[ + 第3部分 + \] + 第5部分来构建你的字符串。

这可以通过捕获组来完成。看一下:h \(。这应该会指引你走向正确的方向。玩得开心!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接