我是一个正则表达式新手,我正在尝试使用正则表达式从文本文件中返回日期列表。日期以mm / dd / yy格式表示,因此多年来,“1955”的年份为“55”。我试图将所有条目从50年回到'99'。
我相信我遇到的问题是,一旦我的正则表达式在一条线上找到匹配,它就会在那里停止并跳转到下一行而不检查线的其余部分。例如,我在文本文件的一行中有12/12 / 12,10 / 10 / 57,10 / 09/66日期,它只返回10/10/57。
到目前为止,这是我的代码。任何提示或提示?谢谢
open INPUT, "< dates.txt" or die "Can't open input file: $!";
while (my $line = <INPUT>){
if ($line =~ /(\d\d)\/(\d\d)\/([5-9][0-9])/g){
print "$&\n" ;
}
}
答案 0 :(得分:1)
关于代码的一些要点
您必须始终 use strict
和use warnings 'all'
位于所有Perl程序的顶部
您应该更喜欢词汇文件句柄和open
如果你的正则表达式模式包含文字斜杠,那么最明显的是使用非标准分隔符,以便它们不需要被转义
虽然Perl的最新版本已经解决了这个问题,但是在使用$&
时曾经有过显着的性能损失,所以最好避免使用它,至少目前是这样。将捕获括号放在整个模式周围并使用$1
代替
此程序将按您的要求执行
use strict;
use warnings 'all';
open my $fh, '<', 'dates.txt' or die "Can't open input file: $!";
while ( <$fh> ) {
print $1, "\n" while m{(\d\d/\d\d/[5-9][0-9])}g
}
10/10/57
10/09/66
答案 1 :(得分:0)
您只需要更改&#39; if&#39;到了&#39;而#39;并且正则表达式将从它停止的地方开始;
open INPUT, "< a.dat" or die "Can't open input file: $!";
while (my $line = <INPUT>){
while ($line =~ /(\d\d)\/(\d\d)\/([5-9][0-9])/g){
print "$&\n" ;
}
}
# Output given line above
# 10/10/57
# 10/09/66
您还可以将整个日期捕获到一个捕获变量中,并使用不同的正则表达式分隔符来保存转义斜杠:
while ($line =~ m|(\d\d/\d\d/[5-9]\d)|g) {
print "$1\n" ;
}
......但这或许是一种品味问题。
答案 2 :(得分:0)
您正在打印$&
,只要遇到任何新匹配,就会更新while(<$fh>) {
@dates = $_ =~ /(\d\d)\/(\d\d)\/([5-9][0-9])/g;
print "@dates\n" if(@dates);
}
。
但是在这种情况下你需要存储所有以前的匹配和更新的匹配,所以你可以使用数组来存储所有的匹配。
Invalid data source:'openflights'
答案 3 :(得分:0)
您也可以使用map来获取年份范围50到99并存储在数组中
open INPUT, "< dates.txt" or die "Can't open input file: $!";
@as = map{$_ =~ m/\d\d\/\d\d\/[5-9][0-9]/g} <INPUT>;
$, = "\n";
print @as;
答案 4 :(得分:0)
另一种方法是删除你不想要的日期。
@using (Html.BeginForm("TestResults", "TestFunctions", null, FormMethod.Post, new { enctype = "multipart/form-data", target = "_blank"}))
{
<input class="btn btn-default" type="file" name="files" id="files" webkitdirectory directory multiple />
<input class="btn btn-default progressButton" type="submit" name="submit" value="Test berichten" />
}