【问题标题】:How to get matching all matching occurences in perl regex如何在 perl 正则表达式中匹配所有匹配的出现
【发布时间】:2014-03-12 12:41:11
【问题描述】:

我有以下文件:

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 字符串返回给我。

【问题讨论】:

  • 为我工作,你是如何得到字符串的?能够通过将其全部放在同一行来重现您的问题

标签: regex perl


【解决方案1】:

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

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

所以试试

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

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

【讨论】:

    【解决方案2】:

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

    例如,你可以做类似的事情

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

    一些解释:

    1. I/O Operatorsperlop:

      来自&lt;&gt; 的输入要么来自标准输入,要么来自命令行中列出的每个文件。

    【讨论】:

    • @Nosrettap &lt;&gt; 表示从所有命令行文件一个一个读取,如果没有这些文件,从STDIN读取。
    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多