1

使用这个正则表达式测试器: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 正则表达式混合,但我无法识别),所以我不确定问题可能是什么。任何帮助表示赞赏!

4

3 回答 3

2

问号在不同的环境中往往有不同的功能(在这个中,我认为它的意思是“匹配前面的字符0或1次”)。我怀疑它与 Perl 的相同。代替

"(\w*?)"

尝试:

"([^"]*)"
于 2012-07-24T21:28:09.583 回答
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 {
于 2012-07-24T21:31:03.310 回答
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}}
于 2012-07-24T21:30:46.193 回答