tech.guitarrapc.cóm

Technical updates

PowerShellで正規表現を使って余計な0を取り除く

正規表現は偉大ですね。 likeよりmatchが好きなPowerShellerです。 さて、今更ですがIPv4は4オクテットに分けられた文字列ですね。 このIPアドレス、時に頭に0が付いた変なアドレスを渡されることがごくまれにあります。例えばこう。

0192.010.000.105

今回は、この頭の0を取り除く方法を正規表現でやってみましょう。

192.10.0.105

ワンライナーで-replaceメソッドを利用する

PowerShellには、Stringに対する.replace() (like処理)と -replace (match処理) があるのは度々紹介してきたとおりです。 今回は正規表現で処理するので -replaceを利用します。

"0192.010.000.105" -replace '\b0+\B'

実行結果はこうです。

192.10.0.105

それぞれ何をしているか分解してみましょう。

\b

\bは、文字列の先頭or末尾にマッチします。 つまり次の判定がかかります。

PS> 0123 -replace "\b0"
123

しかし、これは判定がかかりません。

PS> 1023 -replace "\b0"
1023

0+

+は、直前にある部分正規表現の1回以上の繰り返しにマッチします。 つまり0がある場合にマッチとなります。よってこのように0がなくなります。

PS> '0102' -replace '0+'
12

\bと組み合わせることで頭の0のみに判定をかけるようになります。

PS> '0102' -replace '\b0+'
102

\B

\bが文字の戦闘は末尾に対して、\Bは単語の戦闘及び末尾以外にマッチします。つまりこうです。

PS> '0102' -replace '0+\B'
12
PS> '0102' -replace '0\B'
12
PS> '0102' -replace '\B0+'
012

まとめ

正規表現は奥が深い。