带Select-String的PowerShell RegEx不返回任何行

时间:2012-07-24 21:00:19

标签: regex powershell

使用此注册测试人员:http://myregextester.com/index.php 表示我的正则表达式应该工作: 正则表达式:

{name:"(\w*?)", rank:([\d]+)},

要捕获的样本数据:

{name:"AARON", rank:77},
{name:"ABBEY", rank:1583},

这是我试图运行的powershell脚本,用于将类似json的数据解析为powershell网格。

$regex = '{name:"(\w*?)", rank:([\d]+)},'

(Select-String -Path EmailDomains.as -Pattern $regex -AllMatches).matches |foreach {

$obj = New-Object psobject

$obj |Add-Member -MemberType NoteProperty -Name Rank -Value $_.groups[1].value

$obj |Add-Member -MemberType NoteProperty -Name Name -Value $_.groups[0].value

$obj

} |Out-GridView -Title "Test"

reg-ex似乎永远不会返回值(我猜它是一个MS正则表达式与Perl正则表达式混合,但我无法识别),所以我不确定问题是什么。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

问号通常在不同的环境中具有不同的功能(在这一个中,我认为它意味着“匹配前面的字符0或1次”)。我怀疑它与Perl的相同。而不是

"(\w*?)"

尝试:

"([^"]*)"

答案 1 :(得分:1)

你的表达:

(Select-String -Path EmailDomains.as -Pattern $regex -AllMatches)

返回MatchInfo对象的数组。数组本身没有Matches属性。

您需要做的是使用Slect-Object命令行开关扩展Matches属性,然后沿管道传递:

Select-String -Path EmailDomains.as -Pattern $regex -AllMatches | select-object -expand Matches | foreach {

答案 2 :(得分:0)

我认为你的正则表达式不是问题所在。 Matches是Select-Object返回的每个对象的属性,而不是返回的对象集合。

$regex = '{name:"(\w*?)", rank:([\d]+)},'
$matches = (Select-String -Path .\a.txt -Pattern $regex)

$matches | Select -ExpandProperty Matches | Select @{n="Name";e={$_.Groups[1].Value}}, @{n="Rank";e={$_.Groups[2].Value}}