Powershellでは文字列分割用にSplit演算子が用意されている。
.NetのStringクラスにもSplitメソッドがあるが、Split演算子のほうが若干高機能のように思う。(正規表現サポート等)Regexクラスを使っているのかな・・・。
PS>$str = "aaa bbb ccc" |
違いが出てくるのはこんな時、
PS>$str = "aaa bbb ccc" ccc |
Split演算子のほうは、空白が複数個続いても良きに計らってくれる。
タブなんかが混在していてもOKだ。
PS>$str = "aaa`t bbb ccc" bbb ccc |
区切り文字を指定するときは2項演算子の形式で指定する。
PS>"aaa,bbb,ccc" -split "," |
分割する個数の最大数を指定することもできる。
PS>"aaa,bbb,ccc,ddd" -split ",",3 |
この場合、3を指定しているので、3個に分割される。(3個目以降はひとつに纏められる)
スクリプトブロックで条件を判定することもできる。
PS>"abcdefghijk" -split { $_ -eq "b" -or $_ -eq "j"} |
上記は正規表現を使って以下のようにも書ける。
PS>"abcdefghijk" -split "[bj]" |
ドットのような文字で区切るときは注意が必要だ。
以下のように書いてもうまくいかない。
PS>"a.b.c" -split "." |
これはドットが正規表現指定とみなされるためである。
これを回避するには”simplematch”オプションを指定する必要がある。
ちょっと面倒なことに、これらのオプションは分割最大数を指定したときのみ使える。
分割最大数は0を指定しておけば全てを対象に分割してくれる。
PS>"a.b.c" -split "." , 0 , "simplematch" |
最後にsplit演算子を使ってHTML文書からタグを取り除いてみる。
PS>gc "C:\Documents and Settings\minminnana\デスクトップ\test.txt" | tee -Variable str |
ちなみに"<.*?>"の?は最小マッチの指定。
これが無いと行の先頭の”<”と最後の”>”にマッチして行全体が区切り文字と認識されてしまう。
0 件のコメント:
コメントを投稿