$a = {aa
bb
cc}
$a = $a -split "`n"
$a -contains "aa"
文字列 "aa"が一見外見上の一部である場合はfalseを返します。どうしてこれなの?Powershell:改行で文字列を分割し、-containsを使用する
$a = {aa
bb
cc}
$a = $a -split "`n"
$a -contains "aa"
文字列 "aa"が一見外見上の一部である場合はfalseを返します。どうしてこれなの?Powershell:改行で文字列を分割し、-containsを使用する
Kory Gill's helpful answerを補完するために、問題は、入力がCRLF("`r`n"
)行末を持っていることであることを示唆している、LFによって内ケース-split "`n"
(分割のみ)は結果の配列要素の末尾にCR("`r"
)を残し、実際の値が"aa`r"
であるため、-contains
で"aa"
が見つからないようにします。
のWindows- または Unixスタイルの行末で入力を処理するためジェネリック方法が使用することです。
$a -split '\r?\n' # split $a into lines, whether it has CRLF or LF-only line endings
\r?\n
は、いずれかに一致正規表現(正規表現)でありますCR(\r
)が後に続くLF(\n
)(おそらく?
)。
正規表現エスケープシーケンス\r
と\n
はにPowerShellがエスケープシーケンスを対応`r
と`n
(二重引用符で囲まれストリングのみのどの作業)。それが終末を並べるために来るときのPowerShell自体は非常に柔軟であることを
注:
でもWindowsの上定期的なコンソールでの対話型入力は、行末(\n
) LF-のみを使用しています。
スクリプトはCRLF(\r\n
)またはLF(\n
)行末を持たせ、かつPowerShellのは、ファイルに定義された任意の複数行の文字列リテラルでソースファイルの行末を保持しています。
{
および}
- ソースファイルの行末が結果の文字列に反映されます。[Environment]::NewLine
がプラットフォームに適切な改行(行末)シーケンス含まれています:余談として
"`n"
に"`r`n"
を、しかし、上述したように、入力がすべてプラットフォームに適した改行を持つという保証はありません。
私がコードでnを見るたびに、私はいつもそれがWindows上で `r`nであるべきかどうか疑問に思う。
変更し、このようにコード:
$a = $a -split "`r`n"
または\ n空白文字で分割します: '$ a -split" [\ s] + "' – xXhRQ8sD2L7Z
@ ST8Z6FR57ABE6A8RE9UF: ''\ s +''は行いますが、OPの目的は実行するのではなく_lines_に分割することです空白の – mklement0
ソリューションクロスプラットフォーム:あなたの質問は明らかに思える
$a = $a -split [System.Environment]::NewLine
'' [Environment] :: NewLine'について知っておくと便利ですが、 '-split'でそれを使用することは真のクロスプラットフォームソリューションではありません。プラットフォーム固有のものにしか遭遇しないことが保証されています。 たとえば、通常のPowerShellコンソール_on Windows_に複数行の文字列を定義すると、_LF-only_行の末尾があり、 '-split [Environment] :: NewLine'は行が見つからず、入力文字列全体を返します1つの要素の配列として。 – mklement0
にもかかわらず、それがさらに詳しく説明するように、あなたがそれを編集する助けになるだろう。何を達成しようとしていますか? – nyedidikeke
なぜあなたはスクリプトブロックを分割していますか? (そして、ヒント:あなたはインタラクティブシェルのプログラマーです。PowerShellはfalseを返すときには横たわっていません。これは 'aa'がリストの一部ではないことを意味します。 (例:a -split "\' n ")[0] .Length' =>' 3') – TessellatingHeckler
-Containsはリスト演算子です(リストには項目が含まれていますか)。あなたが探しているものを行うには、like、-match、または.Contains()(文字列メソッド)が必要です。 –