1

この正規表現テスターを使用する: http://myregextester.com/index.php 私の正規表現が動作することを示します: 正規表現:

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

キャプチャするサンプル データ:

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

json のようなデータを解析して powershell グリッドに入れるために、実行しようとしている 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 正規表現の混同だと思いますが、特定できません)。そのため、何が問題なのかわかりません。どんな助けでも大歓迎です!

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 に答える