查找引号之间的数字

时间:2014-11-22 09:13:54

标签: regex powershell

所以我有这条线,还有几条。

<drives name="drive 1" deviceid="\\.\PHYSICALDRIVE0" interface="SCSI" totaldisksize="136,7">

<drives name="drive 1" deviceid="\\.\PHYSICALDRIVE0" interface="SCSI" totaldisksize="1367">

我的这一行与引号之间的数字相匹配:

$(Select-String totaldisksize $Path\*.xml).line -replace '.*totaldisksize="(\d+,\d+)".*','$1'

哪个匹配136,7但不匹配1367。

是否可以匹配两者?

谢谢。

2 个答案:

答案 0 :(得分:2)

不确定

$xmlfile = 'C:\path\to\output.xml'

& cscript sydi-server.vbs -t. -ex -o$xmlfile

[xml]$sysinfo = Get-Content $xmlfile

$driveinfo = $sysinfo.SelectNodes('//drives') |
             select name, @{n='DiskSize';e={[Double]::Parse($_.totaldisksize)}}

注意:Do not parse XML with regular expressions。它会腐蚀你的灵魂,使catgirls痛苦地死去。

答案 1 :(得分:0)

只需在,旁边添加?量词,即可将正则表达式中的,设为可选。

$(Select-String totaldisksize $Path\*.xml).line -replace '.*totaldisksize="(\d+,?\d+)".*','$1'

$(Select-String totaldisksize $Path\*.xml).line -replace '.*totaldisksize="(\d+(?:,\d+)*)".*','$1'

DEMO

正则表达式:

(                        group and capture to \1:
  \d+                      digits (0-9) (1 or more times)
  (?:                      group, but do not capture (0 or more
                           times):
    ,                        ','
    \d+                      digits (0-9) (1 or more times)
  )*                       end of grouping
)                        end of \1