2010年11月14日日曜日

◆Split演算子

Powershellでは文字列分割用にSplit演算子が用意されている。
.NetのStringクラスにもSplitメソッドがあるが、Split演算子のほうが若干高機能のように思う。(正規表現サポート等)Regexクラスを使っているのかな・・・。

PS>$str = "aaa bbb ccc"
PS>-split $str
aaa
bbb
ccc
PS>$str.split()
aaa
bbb
ccc

違いが出てくるのはこんな時、

PS>$str = "aaa bbb     ccc"
PS>-split $str
aaa
bbb
ccc
PS>$str.split()
aaa
bbb

ccc

Split演算子のほうは、空白が複数個続いても良きに計らってくれる。

タブなんかが混在していてもOKだ。

PS>$str = "aaa`t bbb     ccc"
PS>-split $str
aaa
bbb
ccc
PS>$str.split()
aaa

bbb

ccc


区切り文字を指定するときは2項演算子の形式で指定する。

PS>"aaa,bbb,ccc" -split ","
aaa
bbb
ccc

分割する個数の最大数を指定することもできる。

PS>"aaa,bbb,ccc,ddd" -split ",",3
aaa
bbb
ccc,ddd

この場合、3を指定しているので、3個に分割される。(3個目以降はひとつに纏められる)

スクリプトブロックで条件を判定することもできる。

PS>"abcdefghijk" -split { $_ -eq "b" -or $_ -eq "j"}
a
cdefghi
k

上記は正規表現を使って以下のようにも書ける。

PS>"abcdefghijk" -split "[bj]"
a
cdefghi
k

ドットのような文字で区切るときは注意が必要だ。
以下のように書いてもうまくいかない。

PS>"a.b.c" -split "."


これはドットが正規表現指定とみなされるためである。
これを回避するには”simplematch”オプションを指定する必要がある。
ちょっと面倒なことに、これらのオプションは分割最大数を指定したときのみ使える。
分割最大数は0を指定しておけば全てを対象に分割してくれる。

PS>"a.b.c" -split "." , 0 , "simplematch"
a
b
c

最後にsplit演算子を使ってHTML文書からタグを取り除いてみる。

PS>gc "C:\Documents and Settings\minminnana\デスクトップ\test.txt" | tee -Variable str
<html>
<h1>見出し1</h1>
<h2>見出し2</h2>
</html>
PS>$str -split "<.*?>" | %{if($_ -ne ""){$_}}
見出し1
見出し2

ちなみに"<.*?>"の?は最小マッチの指定。
これが無いと行の先頭の”<”と最後の”>”にマッチして行全体が区切り文字と認識されてしまう。

0 件のコメント:

コメントを投稿