Perl正则表达式 - 将分隔符作为字符串本身的一部分

时间:2014-08-05 14:35:51

标签: regex perl

我有一个格式为

的长字符串
id1:2014-08-05 11:24;Does this work?,id2:2014-08-04 13:22; Does this work,too?,id3:2014-07-25 16:56 ...

我试图根据id(即输入)提取'date'和'comment'部分。   例如,如果输入是id2,我希望评论为“这也有效吗?”和日期为'2014-08-04 13:22'。这是我到目前为止的正则表达式。

if($string =~ m/\b$id:(.*?);(.*,?)/){
  my $date = $1;
  my $comment = substr($2,0,-1); #to remove the last ,
}

现在因为有一个','作为字符串本身的一部分,我的正则表达式将它视为分隔符,只返回'这是否有用'作为注释,省略',也是?“一部分。
   当我的字符串本身有分隔符时,任何帮助都会对如何处理提供帮助。

2 个答案:

答案 0 :(得分:4)

我认为最好的方法是从字符串中形成一个哈希值。如果您首先将字符串拆分为任何后面紧跟一些字母数字字符和冒号的逗号,则注释中的逗号将被忽略,您的大部分工作都已完成。

然后使用正则表达式将每个拆分划分为三个块:ID,日期/时间和注释,并将它们放入哈希值。之后,您可以将ID的日期/时间设为$data{id1}[0],将评论设为$data{id1}[1]

该程序演示

use strict;
use warnings;

my $s = 'id1:2014-08-05 11:24;Does this work?,id2:2014-08-04 13:22; Does this work,too?,id3:2014-07-25 16:56 ...';

my %data;
for (split /,(?=\w+:)/, $s) {
  my @fields = /([^:]+):([^;]+);(.+)/g;
  $data{$1} = [ $2, $3 ];
}

print $data{id2}[1], "\n";

<强>输出

 Does this work,too?

答案 1 :(得分:0)

$str = "id1:2014-08-05 11:24;Does this work?,id2:2014-08-04 13:22; Does this work,too?,id3:2014-07-25 16:56; bla";
$id = "id2";
# I need comma to set the end of the last "record"
$str = $str . ",";
if ($str =~ /$id:([\d\-\: ]+);([ \w\?\,]+)\,/) {
   print "date = $1\n";
   print "comment = $2\n";
}