【问题标题】:gvim search match multiple characters using regexgvim搜索使用正则表达式匹配多个字符
【发布时间】:2012-05-28 03:37:07
【问题描述】:

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

arrayA[*].entryx

希望它与以下内容匹配:

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

但它会打印消息说 Pattern not found 即使文件中存在上述行。

arrayA[.].entryx  

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

如何匹配 [] 大括号之间的多个字符?

【问题讨论】:

    标签: regex search vim


    【解决方案1】:

    这是 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 Character Class 详细信息。
    具体来说,Special Characters Inside a Bracketed Character Class 部分。
    [character 启动字符类 (CCL) 后,需要转义的规则发生了变化。

    【讨论】:

    • 为什么结束的 ']' 不需要转义,而开始的 '[' 应该转义?谢谢。
    • 因为当您编写第一个 [ 时,pcre-parser 无法知道您是指 CCL 的元字符还是文字字符。但是,结束 ] 并不含糊——您要么启动了 CCL,要么没有启动 CCL。当您不转义前者时,解析会假定它是元字符。
    【解决方案2】:

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

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

    这将查找文字 [、除] 之外的零个或多个字符、文字 ]、文字 .entryx

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        相关资源
        最近更新 更多