2012-07-24 52 views
1

使用這個表達式測試儀:http://myregextester.com/index.php 表示我正則表達式應該工作: 正則表達式:PowerShell的正則表達式有Select-String不返回任何行

{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" 

正則表達式似乎永遠不會返回值(我猜它是一個MS正則表達式與Perl的正則表達式查詢股價,但我不能確定),所以我不知道這個問題可能是什麼。任何幫助表示讚賞!

回答

2

問號在不同環境中常常具有不同的功能(在這一個中,我認爲它的意思是「匹配前面的字符0或1次」)。我懷疑它和Perl的一樣。取而代之的

"(\w*?)" 

嘗試:

"([^"]*)" 
+0

謝謝。事實上,一旦我糾正了我的reg-ex,我很高興去。 – Richthofen 2012-07-24 21:40:03

+0

在這種情況下的問號告訴星號不要貪婪。 – dugas 2012-07-24 21:45:35

+0

如果這是Perl,你會是正確的。但是,就像我想的那樣,Powershell將問號看作是前一個字符的0或1的匹配。 [請參閱此處的文檔](http://lab.technet.microsoft.com/en-us/magazine/cc137764) – 2012-07-24 21:54:53

0

我不認爲你的正則表達式的問題。匹配是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}} 
1

你的表達:

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

返回MatchInfo對象的數組。數組本身沒有匹配屬性。

你所要做的是使用Slect-對象命令行擴大匹配屬性,那麼傳遞沿着您的管道:

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

謝謝。看起來,再加上reg-ex的變化,使我到了需要去的地方。 – Richthofen 2012-07-24 21:40:10