我是正则表达式的学习者。我试图从下面的字符串中找到日期。 元素<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\>)
任何帮助都将受到高度赞赏。
答案 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-XX
和YYYY-XX-XX HH:MM