让我们将其用作样本数据:
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
进行多行匹配,但似乎无效。
答案 0 :(得分:2)
它与第二部分不匹配,因为else之前的“#”已被消耗掉,所以剩下的就是了
else
int c = 30;
#
与模式不匹配。你可以通过使用lookahead匹配第二个#
而不消费它来解决这个问题:
text.scan(/#.*?(?=#)/m)
答案 1 :(得分:1)
您输入中的第二个#
已与找到的第一个子字符串scan
匹配。从那里,它继续扫描字符串的剩余部分,即:
else
int c = 30;
#endif
当然不包含任何与你的正则表达式相匹配的东西。
答案 2 :(得分:-1)
.*?
找到最短的匹配。只需尝试.*
。