我有正则表达式的问题,
以下是我的数据示例(http://regex101.com/r/rE3hO9/1):
<M ID="9459" C="VSPH" S="I" T="2014-08-04T21:52:33. 0+02:00"><PS><P T="0">[P2000_DS13] vmserv01/vmserv01.vmdk</P><P T="0">29.22 GB</P><P T="0">30.00 GB</P></PS></M>
<M ID="9519" C="VSPH" S="I" T="2014-08-04T21:52:33. 0+02:00"><PS><P T="0">[P2000_DS15] vmserv02/vmserv02.vmdk</P><P T="0">15.20 GB</P><P T="0">15.20 GB</P><P T="0">100.00 GB</P></PS></M>
我需要隔离服务器名称:
<P T="0">[P2000_DS13] vmserv01/vmserv01.vmdk</P>
它的不同值(可以是0,1,2或3)如下:
<P T="0">29.22 GB</P><P T="0">30.00 GB</P>
<P T="0">30.00 GB</P>
到目前为止,我做到了这一点:
<M ID="[0-9]+" C="VSPH" S="I" T="(.*)"><PS><P T="(.*)">\[(.*)] (.*?)\/(.*)<\/P><P T="(.*)">(.*) GB<\/P><P T="(.*)">(.*) GB<\/P><P T="(.*)">(.*) GB<\/P><\/PS><\/M>
但是当我有3个值时它运作良好,但是当我只有2或1时它不匹配。
请你帮忙解决这个问题。
由于
答案 0 :(得分:1)
你需要2个正则表达式。
首先,您将<M>
标记分开:
<M ID="[0-9]+" C="VSPH" S="I" T="[^"]+"><PS>(<P T="0">[^<]+</P>)+</PS></M>
然后对于每个匹配[1],你让这个正则表达式逐个匹配每个<P>
标签:
<P T="0">[^<]+</P>
答案 1 :(得分:0)
假设你想使用正则表达式而不是解析器,
(?:<P(?!S)[^>]*>)([^<(GB$)]*)(?:<\/P>)
这完全取消了服务器名称(值的标签而不是标签的值)。如果你想要标签,那么这将有效:
(<P(?!S)[^>]*>)([^<(GB$)]*)(<\/P>)
这些假设不需要的条目以“GB”结尾。