2

我正在尝试在 gvim 中搜索以下模式:

arrayA[*].entryx

希望它会匹配以下内容:

arrayA[size].entryx  
arrayA[i].entryx
arrayA[index].entryx

但即使文件中存在上述行,它也会打印消息说找不到模式。

arrayA[.].entryx  

仅匹配 arrayA[i].entryx 即 [] 大括号之间只有一个字符。

我应该怎么做才能匹配 [] 大括号之间的多个字符?

4

3 回答 3

2

这是 PCRE 表达式的详细信息

/arrayA\[[^]]*]\.entryx/
         ^^^^^            # 0 or more characters before a ']'
       ^^      ^^         # Escaped '[' & '.'
              ^           # Closing ']' -- does not need to be escaped
 ^^^^^^          ^^^^^^   # Literal parts

如果你想找arrayA[X].entryx哪里,至少有一个字符在[]
你需要替换 \[[^]]*\[[^]]\+

ps:注意我的编辑——我已经把它改成了\*——*你也不能逃避它。
但是,你需要逃避+ :-)


Update关于您的评论:
虽然我的评论回答了您关于]广泛转义的问题,但
有关更多详细信息,请查看Perl 字符类详细信息。
具体来说,Special Characters Inside a Bracketed Character Class节。角色启动字符类 (CCL)
后,需要转义的规则会发生变化。[

于 2012-05-21T16:25:00.320 回答
1

*重复前一个字符;并[开始一个字符类。所以,你需要更多类似的东西:

/arrayA\[[^]]*]\.entryx/

这会查找文字[、一系列零个或多个字符,而不是]文字]、文字.entryx.

于 2012-05-21T16:06:39.790 回答
0

永远记住,在 VIM 中您需要转义一些特殊字符,例如[, ], {,}.. 如前所述,*重复上一个字符,使用这个你可以简单地使用/arrayA\[.*\]\.entryx,但是这个*是贪婪的字符,它可能会匹配一些奇怪的东西,将以下行添加到你的文件中,你会明白:arrayA[size].entryx = arrayB[].entryx

“更安全”的正则表达式是:

/arrayA\[.\{-\}\]\.entryx

.\{-\}以非贪婪的方式匹配任何角色,女巫在某些情况下更安全。

于 2012-05-21T16:29:38.653 回答