从两个标签中检索值,无论其位置如何

时间:2014-07-29 20:52:21

标签: xml regex perl5

我有一个类似下面的XML,我想获取标签customerid和participanttype的值,无论它们在ASObject中的位置如何。

我尝试编写如下所示的正则表达式,当标签的顺序不匹配时,该正则表达式无效。

<customerid tagClass="double">(.*)</customerid>([^^]*?)<participationtype tagClass="String">(clmt|insrd)</participationtype>

XML:

<ASObject mappedClass="com.taliantsoftware.insurance.participation.ParticipantSummaryDTO">
  <customertype tagClass="String">prsn</customertype>
  <linkednoteindicator tagClass="boolean">false</linkednoteindicator>
  <new tagClass="boolean">true</new>
  <customerid tagClass="double">3209053.0</customerid>
  <participationtype tagClass="String">clmt</participationtype>
  <updated tagClass="boolean">true</updated>
  <voided tagClass="boolean">false</voided>
  <blockexist tagClass="boolean">false</blockexist>
  <participationid tagClass="double">2664273.0</participationid>
  <customername tagClass="String">MELISSA M. CORNWELL</customername>
  <customerphonenumber tagClass="String">3303660069</customerphonenumber>
  <effectivedate tagClass="Date">1997-03-02 19:00:00.0 EST</effectivedate>
</ASObject>

1 个答案:

答案 0 :(得分:0)

一般建议是使用XPath而不是使用正则表达式来解析xml。但是,如果您确实希望在正则表达式中执行此操作,则可以使用此模式:

(?s)\A(?=.*<customerid[^>]*>([^<>]*)</customerid>)(?=.*<participationtype[^>]*>([^<>]*)</participationtype>)

the Regex Demo 中,查看右侧窗格以查看截图。

我们检索第1组和第2组的匹配,如下所示:

if ($yourString =~ m!(?s)\A(?=.*<customerid[^>]*>([^<>]*)</customerid>)(?=.*<participationtype[^>]*>([^<>]*)</participationtype>)!) {
    $customerid = $1;
    $participationtype = $1;
}

<强>解释

  • (?s)激活DOTALL模式,允许点跨行匹配
  • \A在字符串
  • 的开头断言我们的位置
  • 前瞻(?=.*<customerid[^>]*>([^<>]*)</customerid>)会将ID记录到第1组
  • 前瞻(?=.*<participationtype[^>]*>([^<>]*)</participationtype>)将类型捕获到第2组