適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

PowerShellで文字列を切り出す方法 4選

プログラミングにおいて文字列の操作は欠かせないですよね。

もちろんPowerShellにおいても文字列操作は大事です。

そしてPowerShellでは文字列の操作がとても簡単に行うことができます。

PowerShellでは、文字列自身が.NETのSystem.Stringオブジェクトであるため、自分自身が持つ強力なメソッドで大抵のことができてしまいます。

もちろんその中には文字列の切り出しメソッドも備わっています。

しかし、方法はそれだけではありません!!

ということで、今回はPowerShellでの文字列の切り出し方法について、まとめてみました。

王道!SubStringメソッド

PoewrShellではすべてがオブジェクトになります。

もちろん文字列もオブジェクトです。

文字列=System.Stringクラスなので、

文字列自体に切り出し用のメソッドが備わっています。

文字列にドットでつなげることでインテリセンスが働いて簡単に呼び出せます。

また、JavaやJavaScriptなどのメジャーな言語でも同じ機能がありますね。

 
#1文字目から2文字⇒12
'12345'.Substring(0,2)
#4文字目から最後まで
'12345'.Substring(3)
#3文字目から2文字⇒34
'12345'.Substring(2,2)

ちょっとややこしいのは、開始文字が0からカウントされること。

そこだけ注意が必要です。

慣れればこれが一番使いやすいかと思います。

VisualBasicのLeft、Right、Mid

Visual Basicに慣れ親しんだ人は

PowerShellからVisual BasicのLeft、Right、Midメソッドを呼び出すのもありかも知れません。

 
#VisualBasicを追加する
Add-Type -AssemblyName Microsoft.VisualBasic
#左から2文字(半角、全角関係なしに2文字)⇒12
[Microsoft.VisualBasic.Strings]::Left('12345',2)
#右から2文字⇒45
[Microsoft.VisualBasic.Strings]::Right('12345',2)
#3文字目から2文字⇒34
[Microsoft.VisualBasic.Strings]::Mid('12345',3,2)

Add-Typeで追加する手間がちょっとマイナスポイントですね。

しかしSubstringと比較すると、

こちらは「左から〇〇文字分」「右から〇〇文字分」「〇〇文字目から〇〇文字分」という指定の仕方なので、

Substringと比べると目的が明確にわかり、直感的なので可読性は〇ですね!

配列を経由する

PowerShellの文字列は文字の配列的なものなので、

インデックス(添え字)を指定することで1つ1つの文字にアクセスすることができます。

その配列スライスと -join演算子を組み合わせることで自在に文字列を切り出すことができます。

若干Pythonチックな切り出し方ですね。

-joinの後の後には、区切り文字を入れるのですが、

文字列の切り出しを目的とするときは空文字列('')を指定してあげます。

 
#左から2文字⇒12
'12345'[0..1] -join ''
#右から2文字⇒45
'12345'[-2..-1] -join ''
#3文字目から2文字⇒34
'12345'[2..3] -join ''
#最初と最後の文字⇒15
'12345'[0,-1] -join ''
#1文字だけ切り出したい場合はjoin演算子は不要⇒2
'12345'[1]

こちらも直感的で、-join演算子の後に指定する文字列を状況に応じて指定してあげることもできるため、応用範囲が広いです。

また、今流行りのPythonに似ている書き方なので、Pythonに馴染みのある方はこの方法もありですね!

最後の例は1文字だけ切り出す場合です。

1文字だけ切り出す場合は、join演算子が不要です。

単純にインデックス(添え字)を指定してあげれば切り出すことができます。

【余談】カンマ区切りにする

[注意]完全に余談です。

ちなみに上記の例では区切り記号に''を指定しましたが、カンマなどの特定の区切り文字を指定することで、区切り文字を指定しつつ文字列を切り出すことができます。

 
#1,2,3
'12345'[0..2] -join ','
#全部の文字をカンマ区切りで(切り出しではないけれども・・・)
#1,2,3,4,5
('12345'.ToCharArray()) -join ','

配列を使えば文字列の切り出しや結合に色々と応用が利くので覚えておいて損はありません!

ちょっと玄人っぽく正規表現を使う

若干マニアックな方法ですが、正規表現を使うことで文字列を切り出すこともできます。

具体的には正規表現で一致した結果が格納される自動変数である$Matchesを組み合わせます。

 
#左から2文字⇒12
[void]('12345' -match '^\w{2}');$Matches[0]
#右から2文字⇒45
[void]('12345' -match '\w{2}$');$Matches[0]
#3文字目から2文字⇒34
[void]('12345' -match '^\w{2}(\w{2})');$Matches[1]

[void]を指定している理由は、-match演算子の結果を表示させないためです。 [void]を指定しないと、$True、$Falseが表示されてしまいます。

この方法の難点はなんといっても正規表現の学習コストです。

また、後で見返したときに何をやっているかがわかりづらくなる可能性がある点もデメリットになるかも知れません。

正規表現に慣れ親しんだ人や完全に個人のツールで使う分には問題になりませんが、
他の人が見たり、保守するようなものの場合は、
文字列の切り出しのために使うかどうかは一考が必要です。

とはいっても正規表現を自在に使いこなすことができれば、
文字数で指定するという概念に囚われることなく、
自由自在に文字列を切り出せることも事実です。

後で見返したときに、

「これは、何をしようとしているんだ・・・?」

とならないような方法を取ってくださいね。

こんな方法もあるよ、くらいに頭の片隅に置いておくと応用が利くかもしれません。

終わりに

PowerShellで文字列を切り出す方法を紹介してみました。

思いつく限り切り紹介しまてみましたが、これ以外の方法もあるかも知れません。

他の方法をご存知の方は、こんな方法もあるよ的なコメントをいただけるとありがたいです。

どの方法もメリットデメリットがあるので、ご自身の環境に合わせて使い分けていただければと思います。

逆に文字を結合したいときは↓の記事をご覧頂ければ幸いです。

www.tekizai.net

というわけで、ここまでお読みいただき、ありがとうございました。

PowerShellで文字列を扱う関連記事

www.tekizai.net

www.tekizai.net

www.tekizai.net

www.tekizai.net