如何在perl正则表达式中匹配所有匹配的匹配项

时间:2014-03-12 03:41:08

标签: regex perl

我有以下文件:

Question:What color is the sky?
Explanation:The sky reflects the ocean.

Question:Why did the chicken cross the road?
Explanation:He was hungry.

我想要获得的是("What color is the sky?", "Why did the chicken cross the road")

的列表

我试图使用perl正则表达式解析此文件,但没有运气。

我将文件的全部内容放在名为$file的字符串中,这就是我正在尝试的内容

my @questions = ($file =~ /Question:(.*)\n/g);

但是这总是只返回整个$file字符串给我。

2 个答案:

答案 0 :(得分:0)

将整个文件放在一个值中会占用太多内存,如果它很大,更好的方法是逐行处理文件。

例如,您可以执行类似

的操作
my @questions;
while (<>) {
    chomp;
    if (m/Question:(.*)/) {
        push @questions, $1;
    }
}

一些解释:

  1. I/O Operators perlop

      

    来自<>的输入来自标准输入,或来自命令行中列出的每个文件。

  2.   

答案 1 :(得分:0)

你的(.*)贪婪地匹配整行,直到它到达\n,这可能是你获取字符串的结果。

您可以添加?以使匹配不贪婪。

所以试试

    my @questions = ($file =~ /Question:(.*?\?)/g);

注意我已转义\?,因此正则表达式将匹配问号