我正在尝试使用PowerShell正则表达式,我有以下页面(下面是下面的)我想要进行匹配,粗体的两个部分是我想要捕获并分配给变量的信息。所以我需要两个正则表达式。从下面的文字中,我需要找到的两个区域是 King 和年&年即可。请注意,这两个区域会发生变化(因此我需要捕获它们),其余的代码保持不变。
这是我目前的正则表达式,但它不适合我。
\s+artist\s*>\s*<\s*!\s*[CDATA\s*[(.*)\s*]\s*]\s*>\s*<\s*/artist
这是我尝试使用正则表达式的页面(或数据)。
<on_air>
<publishedInfo publishedDate="2015-07-18 16:24:28" />
<stationName><![CDATA[Mix 106.5]]></stationName>
<stationPrefix><![CDATA[mix1065]]></stationPrefix>
<generic_coverart><![CDATA[http://media.arn.com.au/images/getImage.aspx?i=generic_mix1065.jpg]]></generic_coverart>
<now_playing>
<audio ID="id_1705168034_30458146" type="song">
<title generic="False"><![CDATA[King*]]></title>
<artist><![CDATA[Years & Years]]></artist>
<number><![CDATA[46029]]></number>
<cut><![CDATA[1]]></cut>
<ref><![CDATA[]]></ref>
<played_datetime><![CDATA[2015-07-18 16:24:27]]></played_datetime>
<length><![CDATA[00:03:28]]></length>
<coverart generic="true"><![CDATA[http://media.arn.com.au/images/getImage.aspx?i=generic_mix1065.jpg]]></coverart>
<options>
<option><![CDATA[KIIS S Integrated]]></option>
</options>
</audio>
</now_playing>
答案 0 :(得分:4)
如果它是有效的XML,那么您不需要使用正则表达式。 PowerShell可以调整XML对象,您可以使用标准属性语法来导航它们:
$xml=[xml]@'
<on_air>
<publishedInfo publishedDate="2015-07-18 16:24:28" />
<stationName><![CDATA[Mix 106.5]]></stationName>
<stationPrefix><![CDATA[mix1065]]></stationPrefix>
<generic_coverart><![CDATA[http://media.arn.com.au/images/getImage.aspx?i=generic_mix1065.jpg]]></generic_coverart>
<now_playing>
<audio ID="id_1705168034_30458146" type="song">
<title generic="False"><![CDATA[King*]]></title>
<artist><![CDATA[Years & Years]]></artist>
<number><![CDATA[46029]]></number>
<cut><![CDATA[1]]></cut>
<ref><![CDATA[]]></ref>
<played_datetime><![CDATA[2015-07-18 16:24:27]]></played_datetime>
<length><![CDATA[00:03:28]]></length>
<coverart generic="true"><![CDATA[http://media.arn.com.au/images/getImage.aspx?i=generic_mix1065.jpg]]></coverart>
<options>
<option><![CDATA[KIIS S Integrated]]></option>
</options>
</audio>
</now_playing>
</on_air>
'@
$xml.on_air.now_playing.audio.title.'#cdata-section'
$xml.on_air.now_playing.audio.artist.'#cdata-section'
答案 1 :(得分:1)
您想要转义括号文字。
此外,避免使用点&#34;匹配几乎任何角色都是一种很好的做法。当您的意图更具体时,元字符。在你的情况下,你真正想要做的是匹配,直到你达到结束括号,所以更明智地指定:
'\s+artist\s*>\s*<\s*!\s*\[CDATA\s*\[([^]]*)\s*\]\s*\]\s*>\s*<\s*\/artist'
注意:正则表达式是上下文的,所以我不必转义字符类中的右括号是因为它的位置,即在否定类中指定的第一个字符 - 在该上下文中,它不能是字符类的结束括号。换句话说,它并不含糊。
答案 2 :(得分:0)
为了帮助您起步,这里有一个关于y&amp; y的建议(尽可能插入空白选择器):
artist><!\[CDATA\[Years & Years\]\]></artist