0

我正在寻找一个匹配除右括号或右括号之外的所有内容的正则表达式。基本上,是这样的:

[^])]

但是,我认为这样的表达式不起作用,因为右括号会关闭集合。那是对的吗?我对 vim 的转义系统如何​​与正则表达式一起工作有点困惑,所以我真的不确定。

4

2 回答 2

1

你试过了吗?因为它有效。制作文档:

test[test]test
test(test)test

然后执行

:%s/[^])]//g

你会留下

]
)

(我正在使用set magic,YMMV)

编辑:在set nomagic,\[^])]将工作。

这不仅限于vim——例如,Ruby 做同样的事情。关键是将右括号作为类中的第一个字符。基本原理是,如果您不想在其中包含至少一个字符,则不会打开字符类,因此如果它是第一个(在可选的否定运算符之后),您可以匹配右括号。

同样,要匹配 caret ^,它不能是第一个字符,要匹配 dash -,它必须是第一个或最后一个(如果你还想匹配],它必须是最后一个,它获得第一个位置)。

于 2012-12-28T06:20:56.380 回答
0

是的,您需要使用 '\' 转义它们:

[^\])]

编辑:显然在这种情况下没有必要......并且在 ')' 之前放置一个 '\' 并不会逃避它,而是将 '\' 添加到不匹配的字符中。我仍然会逃避']'虽然......

编辑 2vim 文档涵盖了这种情况。

要在集合中包含文字 ']'、'^'、'-' 或 '\',请在其前面加上反斜杠:"[xyz\]]"、"[\^xyz]"、"[xy\- z]”和“[xyz\\]”。(注意:POSIX 不支持以这种方式使用反斜杠)。对于 ']',您也可以将其设为第一个字符(在可能的 "^" 之后):"[]xyz]" 或 "[^]xyz]" {Vi 无此功能}。

于 2012-12-28T06:20:35.620 回答