1

我正在尝试将我的 xml 文件中标记内的 h:mm:ss 格式替换为“h 小时,mm 分钟,ss 秒”格式。我面临的问题是,如果时间标签以一行开头和结尾,则正则表达式很适合替换。当标签在第二行开始和结束时,我无法替换格式。

这就是我正在尝试的 -

while(<$rd>) {
   my $currLine = $_;
   $_ =~ s/\<time\> *(.):(..):(..) *\<\/time>/$1 hours, $2 minutes, $3 seconds/g;
   print FILE $_;
}

我的输入文件看起来像这样 -

<time> 1:04:55    </time> this is a good time <time> 
2:04:22 </time> to ask your question Alfred, 
but did you check time <time> 3:45:32 </time> and <time> 02:03:45 </time>

我可以将格式“h:mm:ss”替换为“h 小时,mm 分钟,ss 秒”,但不能用于 2:04:22,因为标签在不同的行打开和结束。

4

2 回答 2

4

不要逐行读取,而是读取到 a </time>,并允许除 ' ' 之外的其他空格:

{
    use autodie 'open';
    open my $input, '<', 'input.xml';
    open my $output, '>', 'output.xml';
    local $/ = '</time>';
    while (<$input>) {
        s/<time>\s*(.):(..):(..)\s*<\/time>/$1 hours, $2 minutes, $3 seconds/;
        print $output $_;
    }
}
于 2013-11-04T06:41:19.063 回答
0

你不需要多行正则表达式功能吗?这是我尝试过的代码片段

my $str = '<time> 1:04:55    </time> this is a good time <time>
2:04:22 </time> to ask your question Alfred,
but did you check time <time> 3:45:32 </time> and <time> 02:03:45 </time>';

$str =~ /<time>[\n\s]*(\d):(\d\d):(\d\d)[\n\s]*<\/time>/mg;
print $1, "\n";
print $2, "\n";
print $3, "\n";

输出

1
04
55

这里/m告诉正则表达式引擎将$str多行字符串视为多行字符串。并且 usingg将在字符串中的所有位置应用更改。

我没有写出您需要的确切解决方案,而只是多行正则表达式的工作方式。如果您需要更多帮助,请告诉我。

编辑

我认为在这个关于多行正则表达式的问题中也值得注意。

 my $str = '<time> 1:04:55    </time> this is a good time <time>
     2:04:22 </time> to ask your question Alfred,
     but did you check time <time> 3:45:32 </time> and <time> 02:03:45 </time>';

$str =~ s/<time>[\n\s]*(\d?\d):(\d\d):(\d\d)[\n\s]*<\/time>/$1 hours, $2 minutes, $3 seconds/mg;
print $str;

输出

1 hours, 04 minutes, 55 seconds this is a good time 2 hours, 04 minutes, 22 seconds to ask your question Alfred,
but did you check time 3 hours, 45 minutes, 32 seconds and 02 hours, 03 minutes, 45 seconds

问题是您的完整输入应该在您应用正则表达式的字符串中。

于 2013-11-04T11:40:11.493 回答