22

私は、PowerShellで複数の空白を削除する方法を見つけようとしていました。

しかし、私が見つけたのは、phpでそれを行う方法です。「複数の空白を削除する

同様の正規表現が利用できる場合があります。

PowerShellで同じことを達成する方法は?

私の弦はこんな感じです

Xcopy Source  Desination

一部の行には、送信元と宛先の間に複数の空白が含まれている場合があります。

4

3 に答える 3

71

複数の連続する空白文字を1つのスペースに折りたたむ場合は、-replace演算子を使用してこれを行うことができます。与えられた...

PS> $beforeReplace = '   [   Hello,   World!   ]   '
PS> $beforeReplace
   [   Hello,   World!   ]   
PS> $beforeReplace.Length
29

-replace...このようにオペレーターを呼び出します...

PS> $afterReplace = $beforeReplace -replace '\s+', ' '
PS> $afterReplace
 [ Hello, World! ] 
PS> $afterReplace.Length
19

の最初のパラメーター-replaceは一致する正規表現パターンであり、2番目のパラメーターは一致するものを置き換えるテキストです。 \sは空白文字と一致し、+1つ以上のオカレンスと一致することを示します。つまり、1つ以上の隣接する空白文字は単一のスペースに置き換えられます。

空白の正規化なしの置換

すべての空白文字をスペースに正規化する必要がない場合、つまりスタンドアロンの空白文字をそのままにしておいても問題ない場合は、長い文字列の場合、このバリエーションの方がパフォーマンスが向上する可能性があります...

PS> $afterReplace = $beforeReplace -replace '\s{2,}', ' '
PS> $afterReplace
 [ Hello, World! ] 
PS> $afterReplace.Length
19

は、「前の要素と少なくとも2回一致する」という意味の数量詞\s{2,}を使用します。したがって、スタンドアロンの空白文字は置き換えられません。入力文字列に空白文字が混在している場合...

PS> $beforeReplace = "1Space: ;2Space:  ;1Tab:`t;2Tab:`t`t;1Newline:`n;2Newline:`n`n;"
PS> $beforeReplace
1Space: ;2Space:  ;1Tab:    ;2Tab:      ;1Newline:
;2Newline:

;
PS> $beforeReplace.Length
57

...2つのアプローチの結果がどのように異なるかに注意してください...

PS> $afterReplaceNormalized = $beforeReplace -replace '\s+', ' '
PS> $afterReplaceNormalized
1Space: ;2Space: ;1Tab: ;2Tab: ;1Newline: ;2Newline: ;
PS> $afterReplaceNormalized.Length
54
PS> $afterReplaceUnnormalized = $beforeReplace -replace '\s{2,}', ' '
PS> $afterReplaceUnnormalized
1Space: ;2Space: ;1Tab: ;2Tab: ;1Newline:
;2Newline: ;
PS> $afterReplaceUnnormalized.Length
54

どちらも同じ長さの文字列を生成しますが、正規化されていない置換では、単一のスペース、単一のタブ、および単一の改行空白が変更されずに実行されます。これは、隣接する空白文字が同一であるかどうかに関係なく、まったく同じように機能します。

追加のドキュメント

于 2011-12-31T06:56:18.883 に答える
0
'[     Hello,     World!     ]' -replace '^\[\s+','[' -replace '\s+]$',']' -replace '\s+',' '

ベーコンには、PowerShellが面白いという説明があります。パワーシェルのエスケープ文字が`であることを知っていても、私は一緒にエスケープしなければなり'['ませんでした。'\'

于 2020-09-02T03:14:56.050 に答える
0

別の方法。-左側の分割は可変空白で分割します:

-split 'Xcopy Source  Destination' -join ' '

Xcopy Source Destination
于 2020-09-02T04:05:37.130 に答える