为什么String#scan找不到所有的匹配?

时间:2009-10-29 19:56:30

标签: ruby regex

让我们将其用作样本数据:

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 个答案:

答案 0 :(得分:2)

它与第二部分不匹配,因为else之前的“#”已被消耗掉,所以剩下的就是了

else
    int c = 30;
#

与模式不匹配。你可以通过使用lookahead匹配第二个#而不消费它来解决这个问题:

text.scan(/#.*?(?=#)/m)

答案 1 :(得分:1)

您输入中的第二个#已与找到的第一个子字符串scan匹配。从那里,它继续扫描字符串的剩余部分,即:

else
        int c = 30;
#endif

当然不包含任何与你的正则表达式相匹配的东西。

答案 2 :(得分:-1)

.*?找到最短的匹配。只需尝试.*