我正在尝试使用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
但我认为必须有一种方法可以用一个匹配表达式来做到这一点吗?
答案 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
前面有一个名称,而不是+
量词,而不是的*?
匹配的东西或者什么都没有,只是尽可能少