在perl中使用正则表达式更改时间格式

时间:2014-11-17 03:51:20

标签: regex perl

我想从文件中读取12小时格式时间并将其替换为24小时

例如

  

这是在凌晨3:15到期 - >这应该是15:15

我尝试在regex中保存变量并稍后进行manupilate但是没有工作,我也尝试使用替换" / s"但因为它是可变的我无法弄清楚

这是我的代码:

while (<>) {
            my $line = $_;
        print ("this is text before: $line \n");
        if ($line =~ m/\d:\d{2}pm/g){
            print "It is PM! \n";}
        elsif ($line =~ m/(\d):(\d\d)am/g){
                print "this is try: $line \n";
            print "Its AM! \n";}
            $line =~ s/($regexp)/<French>$lexicon{$1}<\/French>/g;
            print "sample after : $line\n";
}

3 个答案:

答案 0 :(得分:2)

一个简单的脚本可以为您完成工作

$str="this is due at 3:15pm";
$str=~m/\D+(\d+):\d+(.*)$/;

$hour=($2 eq "am")? ( ($1 == 12 )? 0 : $1 ) : ($1 == 12 ) ? $1 :$1+12;
$min=$2;

$str=~s/at.*/$hour:$min/g;
print "$str\n";

输出为

 this is due 15:15

它的作用??

  • $str=~m/\D+(\d+):(\d+)(.*)$/;尝试将字符串与正则表达式匹配

    • \D+匹配除数字以外的任何内容。在这里它匹配this is due at

    • (\d+)匹配任意数量的数字。在这里它匹配3。在第1组捕获,$1这是小时

    • :匹配:

    • (\d+)匹配任意数量的数字。这里它匹配15,这是分钟

    • (.*)匹配以下任何内容,am。第2组捕获,“$ 2

    • $将正则表达式锚定在

    • 的末尾
  • $hour=($2 eq "am")? ( ($1 == 12 )? 0 : $1 ) : ($1 == 12 ) ? $1 :$1+12;转换为24小时制。如果$2 pm 12添加12,除非它是am。如果时间是120,那么小时为$str=~s/at.*/$hour:$min/g;

  • at$hour:$min中的任何内容替换为{{1}}的字符串结尾,这是从

  • 之前执行的三元操作获得的时间

答案 1 :(得分:1)

#!/usr/bin/env perl
use strict;
use warnings;

my $values = time_12h_to_24h("11:00 PM");

sub time_12h_to_24h
{
    my($t12) = @_;
    my($hh,$mm,$ampm) = $t12 =~ m/^(\d\d?):(\d\d?)\s*([AP]M?)/i;
    $hh = ($hh % 12) + (($ampm =~ m/AM?/i) ? 0 : 12);
    return sprintf("%.2d:%.2d", $hh, $mm);
}

我在下面的链接中找到了这段代码。请检查: Is my pseudo code for changing time format correct?

答案 2 :(得分:0)

尝试这样做可以满足您的期望

my @data = <DATA>;
foreach my $sm(@data){
if($sm =~/(12)\.\d+(pm)/g){
    print "$&\n";
}
elsif($sm =~m/(\d+(\.)?\d+)(pm)/g )
{
print $1+12,"\n";
}
}

__DATA__
Time 3.15am
Time 3.16pm
Time 5.17pm
Time 1.11am
Time 1.01pm
Time 12.11pm