重复序列的正则表达式

时间:2013-09-27 09:36:20

标签: regex

我是正则表达式的学习者。我试图从下面的字符串中找到日期。 元素<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\>)

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分: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

格式的日期匹配