Perl正则表达式:在给定匹配后匹配字符串的第一个实例

时间:2014-01-10 09:44:57

标签: regex perl

我正在尝试使用perl正则表达式解析文本文件。这是一个示例数据集:

"Field1", "Field2", "Field3", "Field4", "Field5"
"val1-1", "\\path\to\val1-2.txt", "val1-3", "\\path\to\val1-4.ini", "val1-5.txt"
"val2-1", "val2-2", "\\path\to\val2-3.txt", "\\path\to\val2-4.ini", "val2-5.txt"
"\\path\to\val3-1.txt", "val3-2", "val3-3", "\\path\to\val3-4.ini", "val3-5.txt"

对于每行文本,我正在尝试匹配.txt文件名的第一个实例;上面数据集中的粗体子串。

我认为这样可行:

while(<INFILE>) {
    if(m/\\(.*?\.txt)"/) {
        print "$1\n";
    }
}

输出:

\path\to\val1-2.txt
\path\to\val2-3.txt
\path\to\val3-1.txt

但它没有,因为它将匹配完整路径,而不仅仅是文件名。

现在可行:

while(<INFILE>) {
    if(my @matches = $_ =~ m/(.*?)"/g) {
        foreach (@matches) {
            print "$1\n" if(m/.*\\(.*?\.txt)/);
        }
    }
}

输出:

val1-2.txt
val2-3.txt
val3-1.txt

但我认为必须有一种方法可以用一个匹配表达式来做到这一点吗?

2 个答案:

答案 0 :(得分:1)

怎么样:

my $re = qr~\\([^\\"]+)"~;
while(<DATA>) {
    chomp;
    if(my @m = /$re/g) {
        say "@m";
    }
}

__DATA__
"Field1", "Field2", "Field3", "Field4", "Field5"
"val1-1", "\\path\to\val1-2.txt", "val1-3", "\\path\to\val1-4.ini", "val1-5.txt"
"val2-1", "val2-2", "\\path\to\val2-3.txt", "\\path\to\val2-4.ini", "val2-5.txt"
"\\path\to\val3-1.txt", "val3-2", "val3-3", "\\path\to\val3-4.ini", "val3-5.txt"

<强>输出:

val1-2.txt val1-4.ini
val2-3.txt val2-4.ini
val3-1.txt val3-4.ini

如果您只想要第一个.txt,请执行:

my $re = qr~\\([^\\"]+\.txt)~;
while(<DATA>) {
    chomp;
    /$re/ && say $1;
}

答案 1 :(得分:1)

试试这个:

while (<DATA>) {
    if(m/([^\\]+\.txt)"/) {
        print "$1\n";
    }
}

__END__
val1-2.txt
val2-3.txt
val3-1.txt

您不需要捕获组外的\。相反,寻找所有不是反斜杠而不仅仅是一切的东西。由于您希望文件在.txt前面有一个名称,而不是+量词,而不是*?匹配的东西或者什么都没有,只是尽可能少