perl regex:搜索整行文件

时间:2016-04-06 04:03:56

标签: regex perl

我是一个正则表达式新手,我正在尝试使用正则表达式从文本文件中返回日期列表。日期以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"  ;
        }
}

5 个答案:

答案 0 :(得分:1)

关于代码的一些要点

  • 必须始终 use strictuse 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" />
}