代码之家  ›  专栏  ›  技术社区  ›  Geo

为什么字符串扫描没有找到所有匹配项?

  •  0
  • Geo  · 技术社区  · 15 年前

    让我们将其用作示例数据:

    text=<<EOF
    #if A==20
            int b = 20;
    #else
            int c = 30;
    #endif
    

    这个代码:

    puts text.scan(/\#.*?\#/m)
    

    为什么这只捕获了这个:

    #if A==20
        int b = 20;
    #
    

    我也期待着这一点:

    #else
        int c = 30;
    #
    

    我必须修改什么,以便它也捕获到这些信息?我用过 /m 对于多行匹配,但似乎不起作用。

    3 回复  |  直到 15 年前
        1
  •  2
  •   sepp2k    15 年前

    它与第二部分不匹配,因为前面的“”已经被消耗掉了,所以剩下的都是IST

    else
        int c = 30;
    #
    

    与模式不匹配。您可以使用lookahead来匹配第二个 # 不消费:

    text.scan(/#.*?(?=#)/m)
    
        2
  •  1
  •   Pavel Minaev    15 年前

    第二 # 在您的输入中,已与第一个子字符串匹配 scan 找到。从那里,它开始扫描 剩下的 字符串的一部分,它是:

    else
            int c = 30;
    #endif
    

    当然,它不再包含任何与您的regex匹配的内容。

        3
  •  -1
  •   Hyman Rosen    15 年前

    .*? 找到最短的匹配项。试一试 .* 相反。

    推荐文章