4

次のテキストの出力に、引用符で囲まれたテキストのみ(引用符なし)を表示させるにはどうすればよいですか?

サンプルテキスト"

this is an "apple". it is red
this is an "orange". it is orange
this is an "blood orange". it is reddish

になります:

apple
orange
blood orange

できればワンライナーでやりたいです。-matchを使った正規表現だと思いますが、よくわかりません。

4

3 に答える 3

5

ここに1つの方法があります

$text='this is an "apple". it is red
this is an "orange". it is orange
this is an "blood orange". it is reddish'

$text.split("`n")|%{
$_.split('"')[1]
}

これが勝利のソリューションです

$text='this is an "apple". it is red
this is an "orange". it is orange
this is an "blood orange". it is reddish'

$text|%{$_.split('"')[1]}
于 2013-01-28T18:34:50.053 に答える
3

正規表現を使用した別の方法:

appcmd list apppool | % { [regex]::match( $_ , '(?<=")(.+)(?=")' ) } | select -expa value

また

 appcmd list apppool | % { ([regex]::match( $_ , '(?<=")(.+)(?=")' )).value }
于 2013-01-28T19:25:48.087 に答える
0

[regex]::Matches()PSv3+ 構文を使用した、.NET メソッドに基づく簡潔なソリューション:

$str = @'
this is an "apple". it is red
this is an "orange". it is orange
this is an "blood orange". it is reddish
'@

[regex]::Matches($str, '".*?"').Value -replace '"'

正規表現は - で囲まれたトークンに".*?"一致し、それらすべてを返します。それらを抽出し、文字を取り除きます。"...".Matches().Value-replace '"'"

これは、上記が1 行に複数の "..."トークンがあっても機能することを意味します (ただし、エスケープされた文字 (例: ) が埋め込まれた トークンの抽出は機能しないことに注意してください)。"\"


-match(1 つの) 一致のみを検索する演算子使用は、次の場合にのみオプションです。

  • 入力を行に分割します
  • 各行には最大で 1 つ "..."のトークンが含まれます (これは、質問のサンプル入力に当てはまります)。

PSv4+ ソリューションは次のとおりです。

# Split string into lines, then use -match to find the first "..." token
($str -split "`r?`n").ForEach({ if ($_ -match '"(.*?)"') { $Matches[1] } })  

自動変数$Matchesには前の操作の結果が含まれ-match(LHS がスカラーの場合)、インデックス[1]には最初の (そして唯一の) キャプチャ グループ ( (...)) が一致したものが含まれます。


-matchたとえば、という名前のバリアントがあれば-matchall、次のように記述できると便利です。

# WISHFUL THINKING (as of PowerShell Core 6.2)
$str -matchall '".*?"' -replace '"'

GitHub でこの機能の提案を参照してください。

于 2019-02-09T19:21:05.737 に答える