我有一个类似下面的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>
答案 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组