使用此注册测试人员: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正则表达式混合,但我无法识别),所以我不确定问题是什么。任何帮助表示赞赏!
答案 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}}