-1

我是正则表达式的学习者。我正在尝试从以下字符串中查找日期。该元素<ext:serviceitem>在实际 xml 中最多可以重复 20 次。我只需要取出日期字符串(就像名称中以 Date 结尾的任何元素一样,我需要该元素的值,即日期)。例如和。我希望(仅)打印出所有这些日期。

<ext:serviceitem><ext:name>EnhancedSupport</ext:name><ext:serviceItemData><ext:serviceItemAttribute name="Name">E69D7F93-81F4-09E2-E043-9D3226AD8E1D-1</ext:serviceItemAttribute><ext:serviceItemAttribute name="ProductionDatabase">P1APRD</ext:serviceItemAttribute><ext:serviceItemAttribute name="SupportType">Monthly</ext:serviceItemAttribute><ext:serviceItemAttribute name="Environment">DV1</ext:serviceItemAttribute><ext:serviceItemAttribute name="StartDate">2013-11-04 10:02</ext:serviceItemAttribute><ext:serviceItemAttribute name="EndDate">2013-11-12 10:02</ext:serviceItemAttribute><ext:serviceItemAttribute name="No_of_WeeksSupported"></ext:serviceItemAttribute><ext:serviceItemAttribute name="Cost"></ext:serviceItemAttribute><ext:serviceItemAttribute name="SupportNotes"></ext:serviceItemAttribute><ext:serviceItemAttribute name="FiscalQuarterNumber"></ext:serviceItemAttribute><ext:subscription><ext:loginID>kbasavar</ext:loginID><ext:ouname>020072748</ext:ouname></ext:subscription></ext:serviceItemData></ext:serviceitem><ext:serviceitem><ext:name>EnhancedSupport</ext:name><ext:serviceItemData><ext:serviceItemAttribute name="Name">E69D7F93-81F4-09E2-E043-9D3226AD8E1D-2</ext:serviceItemAttribute><ext:serviceItemAttribute name="ProductionDatabase">P1BPRD</ext:serviceItemAttribute><ext:serviceItemAttribute name="SupportType">Quarterly</ext:serviceItemAttribute><ext:serviceItemAttribute name="Environment">TS2</ext:serviceItemAttribute><ext:serviceItemAttribute name="StartDate">2013-11-11 10:03</ext:serviceItemAttribute><ext:serviceItemAttribute name="EndDate">2013-11-28 10:03</ext:serviceItemAttribute><ext:serviceItemAttribute name="No_of_WeeksSupported"></ext:serviceItemAttribute><ext:serviceItemAttribute name="Cost"></ext:serviceItemAttribute><ext:serviceItemAttribute name="SupportNotes"></ext:serviceItemAttribute><ext:serviceItemAttribute name="FiscalQuarterNumber"></ext:serviceItemAttribute><ext:subscription><ext:loginID>kbasavar</ext:loginID><ext:ouname>020072748</ext:ouname></ext:subscription></ext:serviceItemData></ext:serviceitem>

我尝试使用下面的正则表达式,但它在第一次出现后返回字符串的其余部分。

(?<=Date\"\>).*(?=\<\/ext\:serviceItemAttribute\>)

任何帮助将不胜感激。

4

1 回答 1

0

你的问题是.* 贪婪,这意味着它会从第一个实例抓取Date到最后一个实例</ext:ser....。替换为.*.*?它将改变你所追求的行为。

#(?<=Date">).*?(?=</ext:serviceItemAttribute>)#i

您应该.*?在捕获组中:(.*?).

#(?<=Date">)(.*?)(?=</ext:serviceItemAttribute>)#i

你也可以这样做——更简单——比如:

#Date">(.*?)</ext#i

更新

正如在下面的评论中所指出的,这个(上面的)解决方案依赖于使用非贪婪匹配。

为了解决这个问题,您可以使用以下内容:([^<]*)而不是(.*?)

注意:这不会影响下面的替代方案。


备择方案

/(\d{4}-\d{2}-\d{2})/
/(\d{4}-\d{2}-\d{2} \d{2}:\d{2})/

上述模式将分别匹配格式中的日期YYYY-XX-XXYYYY-XX-XX HH:MM

于 2013-09-27T09:53:25.563 回答