复杂条件正则表达式


Complex conditional regex

我有一个问题与正则表达式,

下面是我的数据样本(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时它不匹配。

你能帮我一下吗?

谢谢

您将需要2个正则表达式。

首先分离<M>标签:

<M ID="[0-9]+" C="VSPH" S="I" T="[^"]+"><PS>(<P T="0">[^<]+</P>)+</PS></M>

然后对于每个匹配[1],让这个正则表达式匹配里面的每个<P>标签,一个接一个:

<P T="0">[^<]+</P>

假设您想使用正则表达式而不是解析器,

(?:<P(?!S)[^>]*>)([^<(GB$)]*)(?:<'/P>)

这将完全隔离服务器名称(的值,但不包括标记)。如果你想要标签,那么这就可以了:

(<P(?!S)[^>]*>)([^<(GB$)]*)(<'/P>)

假设不需要的条目以"GB"结尾