2016-05-12 3 views
2

二つの文字列の間でデータを取得する(タイプは[]オブジェクトです):& &をトレース#217>:

Success... 
Go! 
0:#217> trace && .quit 
    0x000 Subline   : _OK 
    0x008 Timed  : NO 
    0x016 Check  : _OK 
    0x022 Post  : 
    0x030 Offset   : None 
    0x038 Hint  : False 
    0x050 NextHint : False 
quit: 

は、私は、文字列0の間のテキストを抽出する必要があります

[Regex]::Match($out, "(?<=.quit').+?(?=quit:)").Value 

しかし線(String型)にデータを要求し、この抽出物は、ではないカラム([]オブジェクト): .quitとを終了: 私が書きました。これを修正するには?

P.S.

([Regex]'(?is)(?:(?<=\.quit).+(?=quit:))').Match(($out -join "`n")).Value 

を次のように私は自分自身で問題を解決ししかし、おそらくこれを行うには、より完璧な方法はありますか?

+0

を解決しました。 @ jisaakの答えを 'String []'で使用すると、結果が得られます。そうではありません。あなたは '$ out'をどうやって作りましたか? – TessellatingHeckler

答えて

1

問題は、私は `は、Get-Content`から来た[]` `文字列であなたの正規表現を実行すると、私は結果を得るない

([Regex]'\s+0x([^q]+)').Match(($out -join "`n")).Value 
0

ちょうどあなたの結果のString[]を作成するために-split機能を使用します。

$result = ([regex]::Match($a, '\.quit(.*)quit:').Groups[1].value) -split [System.Environment]::NewLine 
+0

動作しません。私は同じ結果を得ました。 – kate

+0

'n –

0

[編集:$outString[]であれば、これは動作します、例えばあなたの他のコメントから、$out = Get-Content results.txtから、あなたは何か異なるかもしれません]。

一般的な方法として、行の通過の可否を選択するtrue/falseフラグを設定し、最初の行が表示されたらフラグを設定し、最後の行が表示されたらフラグを変更します。

$middle = foreach ($line in $out) { 
    if ($line -match '^quit') { $allow = $false } 
    if ($allow) { write-output $line } 
    if ($line -match '0:#217>') { $allow = $true } 
} 

テストの順序は、開始行または終了行が結果に表示されるかどうかを決定します。

このようなものの中に、タイピングのためのコンソール上で短縮することができます。これはうまくいくかもしれない

# loop # end line clears flag  # print?  # start line sets flag 
$out |% { if($_ -match '^quit'){$f=0}; if ($f){$_}; if ($_ -match '0:#217>'){$f=1} } 
+0

を使って分割してみてください。ええ、ええ...サイクルで必要なデータを取得することは非常に悪い考えです! – kate

+0

...なぜそれは "非常に悪い考え"ですか? – TessellatingHeckler

0

、それはいくつかの仮定になり:

$out -match '^ ' 
  1. $ outは常に文字列であります[]。単一の文字列である場合は、@($out)で強制してください。
  2. PowerShell v4またはv5を使用しているため、-operatorはアレイ上のフィルタとして機能します。
  3. サンプルデータは正確で、すべての行はスペースで始まり、他のすべての行は始まりません。
関連する問題