从字符串中提取分隔的子字符串

时间:2017-12-03 01:25:22

标签: regex perl

我有一个看起来像这样的字符串

my $source = "PayRate=[[sDate=05Jul2017,Rate=0.05,eDate=06Sep2017]],item1,item2,ReceiveRate=[[sDate=05Sep2017,Rate=0.06]],item3" ;

我想使用捕获组仅提取第一个PayRate块中包含的[[...]]值。

$1 = "Date=05Jul2017,Rate=0.05,EDate=06Sep2017"

我尝试了这个,但它返回整个字符串。

my $match =~ m/PayRate=\[\[(.*)\]\],/ ;

很明显,我必须在其中放置一系列{(.*)=(.*)}块的特定模式。需要专家建议。

2 个答案:

答案 0 :(得分:4)

您正在使用贪婪匹配.*,在匹配时消耗尽可能多的输入,您首先匹配 {{ 1}}到 last [[

相反,请使用不情愿的匹配]],匹配为 little ,同时仍匹配:

.*?

答案 1 :(得分:0)

在匹配时使用/x modifier(并替换),这样您就可以使用空白区域来更轻松地阅读和评论,以了解正在发生的事情。通过匹配不在模式中的所有内容来限制模式。 [^\]]*?优于.*?

my ( $match ) = $line =~ m{
    Payrate \= \[\[  # select which part
    ( [^\]]*? )      # capture anything between square brackets
}x;