単一および二重の空白で分割されたPowerShell正規表現


2

私は問題を抱えており、正規表現と代替方法を使用して二重および単一の空白を表現するときに見落としている、または理解していない単純なものだと確信しています

PowerShellで速記メタ文字\s|\s\sを使用して、複数の文字列オブジェクトを返します。各文字列は単一または二重の空白ごとに改行されるため、他のすべては期待どおりに行分割されます。 -split

サンプルデータとPowerShellコマンド

注意:残念ながら、これは私が働いているし、それがありますので、私はそれを制御することはできませんデータの一例であるシングルとダブルの空白を両方

$Content = "Data is over here
and here is some down  under too"

$Content -split "\s|\s\s"

結果

Data
is
over
here

and
here
is
some
down

under
too

期待される結果

Data
is
over
here
and
here
is
some
down
under
too

環境仕様

  • Windows 10 Pro X64
  • PowerShell 5.0

質問

簡略メタ文字代替構文で使用している正規表現形式で何が起こっているのかを理解したいのですが、他に決定的なものがない場合は回避策検討します。


最初\sは常に最初に一致します。したがって、二重スペースでは、スペースごとに1回ずつ、2回分割します。また、文字列に新しい行を追加するのではなく、複数の文字列オブジェクトを返します。
-jscott

ルークの答えは私がやる方法です。それは「回避策」ではありません。「\ sが最初に一致することを理解しています」と言うことができるかどうかは明確ではありませんが\s\s、一致が既に存在するため、チェックされません。
jscott

1
-split '\s\s|\s'
PetSerAl

@jscott質問で本当に探していたコンテンツに回答を追加しました。私はあなたが言っていることを理解しましたが、私が使っていた正規表現の方法とそれをそのように機能させる方法で、詳細などを探していました。正規表現の代替と空白の正規表現の短縮形を使用する方法。PetSerAlが必要な詳細を提供してくれたのを見ると、そこから私は不足しているものをより詳細に把握できました。私があなたが言及したのを見落とした何か他のものがある場合、私は謝罪します-あなたの時間をありがとう。
ピンプジュースIT

回答:


3

代わりにこれを使用します。これは、タブ、スペースなどの空白文字が1つ以上出現することを意味します。

$Content -split "\s{1,}"

結果:

PS C:\WINDOWS\system32> $Content = "Data is over here
and here is some down  under too"

$Content -split "\s{1,}"
Data
is
over
here
and
here
is
some
down
under
too

PS C:\WINDOWS\system32> 

2

PetSerAlに感謝し、彼のコメントで指摘されているように:「-split '\s\s|\s'PetSerAl

落とし穴

正規表現の代替使用する際に学ぶべき重要な教訓があると思います。それは、それらを置く順序が非常に重要になる可能性があります

理由

これが機能しなかったのは、式が最初に単一の空白文字を探していたためであり、2つの空白がある場所に遭遇するたびに1つが残されていたため、これは問題でした。そのため、出力に空白行がいくつか見られました。


ソリューション

私は単純に交代内の位置を切り替えることによって、これを固定し、1つの空白の上に二重の空白を好むようにそれを告げた(つまり、使用\s\s|\sしていない\s|\s\s)ので、最初の2つの空白に分割し、二重の白いスペースがない場合には、それ'その後、単一の空白で分割します。

ソリューションスクリプト

$Content = "Data is over here
and here is some down  under too"
$Content

$Content -split "\s\s|\s"

結果

Data
is
over
here
and
here
is
some
down
under
too
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.