どうも!リョクちゃです。
ご無沙汰しております。
月日が流れてなんと1カ月更新できていなかったです。。。すみません!
気を取り直して、今回は正規表現をなんとPowerShellで使ってみた記事になります。
ちなみに前回はこちら
目次
正規表現とは?
調べてみると
正規表現(せいきひょうげん、英: regular expression)は、文字列の集合を一つの文字列で表現する方法の一つである。正則表現()とも呼ばれ、形式言語理論の分野では比較的こちらの訳語の方が使われる。まれに正規式()と呼ばれることもある。
となっています。
かいつまんで、解釈すると
とある文字列の中からあるパターン(正規表現のパターン)に
一致する文字列を検索する際に活用される表現法のひとつになります。
正規表現については、おそらく下記URLの記事がとても参考になります。
あえて、ここでは詳細には記載していませんのでご了承ください。
他言語での正規表現に関する記事
正規表現については、他の言語でも活用した記事を紹介していました。
VB.Net
PowerShellで正規表現を使うには?
正規表現をPowerShellで使うには、
と記述することで検索したい文字列が正規表現のパターンにマッチしているか
どうかを判定し、True/Falseで結果を返してくれます。
-matchが肝です。
電話番号
電話番号には、固定電話や携帯電話、PHSなどがあります。
固定電話
総務省のページより
初めの0、国内プレフィックスから始まり。
・市外局番(1~4桁)
・市内局番(1~4桁)
・加入者番号(4桁)
となっています。
つまりは、
-
0-▲-××××-□□□□
-
0-▲▲-×××-□□□□
-
0-▲▲▲-××-□□□□
-
0-▲▲▲▲-×-□□□□
0 ⇒ 国内プレフィックス
▲ ⇒ 市外局番
× ⇒ 市内局番
□ ⇒ 加入者番号
のパターンが現在あるようです。
携帯電話・PHS
こちらも総務省のページより
070、080や090から始まる11桁の番号を携帯電話・PHSとしているようです。
元々070はPHSで使われていた番号なのですが、最近は携帯電話の番号を変更することなく、
移すことができる制度、MNP(携帯電話番号ポータビリティ)によって
携帯電話との区別がなくなってきました。※平成26年10月1日施行
パターンとしては
-
070 – ○○○○ – ○○○○
-
080 – ○○○○ – ○○○○
-
090 – ○○○○ – ○○○○
になります。
電話番号の正規表現
ここからは前述した固定電話と携帯電話・PHSの正規表現を構築していきます。
固定電話の正規表現
固定電話の場合は、4パターンありました。
そのため正規表現は、以下のような形になります。
^0(([0-9]-[0-9]{4}|[0-9]{2}-[0-9]{3}|[0-9]{3}-[0-9]{2}|[0-9]{4}-[0-9])
-[0-9]{4})$
正規表現に使われる主な記号は以下の表にまとめています。
No | 記号 | 機能 |
---|---|---|
1 | ^ | 始まりを表す。 |
2 | $ | 終わりを表す。 |
3 | [0-9] | マッチする文字列の範囲を指定。 (今回の場合、文字列内に0~9が含まれているか) |
4 | | | ORのようなもの 右辺と左辺に書かれたパターンのどれかにマッチするかどうか。 |
5 | {n} | n回の繰り返しにマッチするか |
6 | - | ハイフンがマッチするか。 |
最初は国内プレフィックスから始まるため、0を記述しています。
オレンジ()で囲まれた部分が、市外局番/市内局番の組み合わせを表す正規表現になります。
以降に続く、-[0-9]{4}が加入者番号を表現した記述になります。
携帯電話・PHSの正規表現
一方で携帯電話・PHSは以下のような形になります。
^((070|080|090)-[0-9]{4}-[0-9]{4})$
となります。
(070|080|090)では、はじまりが070、080、090であるかどうかを表しています。
後続の-[0-9]{4}でハイフンから始まり4桁の0~9で始まる数字か
どうかを判定する表現になります。
正規表現を使って電話番号をマッチング
先で構築した正規表現のパターンを使って、実際に入力された情報が
固定電話か携帯電話・PHSかどうか試してみます。
固定電話:01-1234-5678を例にコードを書いていきます。
1 2 3 4 5 |
$input = "01-1234-5678" $tel_ptr = "^0(([0-9]-[0-9]{4}|[0-9]{2}-[0-9]{3}|[0-9]{3}-[0-9]{2}|[0-9]{4}-[0-9])-[0-9]{4})$" Write-Host $input -match $tel_ptr # True/Falseが返されます。 ← 今回の場合、 True |
固定電話:012-234-5678
1 2 3 4 5 |
$input = "012-234-5678" $tel_ptr = "^0(([0-9]-[0-9]{4}|[0-9]{2}-[0-9]{3}|[0-9]{3}-[0-9]{2}|[0-9]{4}-[0-9])-[0-9]{4})$" Write-Host $input -match $tel_ptr # True/Falseが返されます。 ← 今回の場合、 True |
固定電話の正規表現で携帯電話をマッチングさせてみると
固定電話:012-3456-7890
1 2 3 4 5 |
$input = "012-3456-7890" $tel_ptr = "^0(([0-9]-[0-9]{4}|[0-9]{2}-[0-9]{3}|[0-9]{3}-[0-9]{2}|[0-9]{4}-[0-9])-[0-9]{4})$" Write-Host $input -match $tel_ptr # True/Falseが返されます。 ← 今回の場合、 False |
Falseとなります。
次は、携帯電話・PHSのパターンを使って試していきます。
携帯電話:012-3456-7890
1 2 3 4 5 |
$input = "012-3456-7890" $tel_ptr = "^((070|080|090)-[0-9]{4}-[0-9]{4})$" Write-Host $input -match $tel_ptr # True/Falseが返されます。 ← 今回の場合、 False |
携帯電話:070-3456-7890
1 2 3 4 5 |
$input = "070-3456-7890" $tel_ptr = "^((070|080|090)-[0-9]{4}-[0-9]{4})$" Write-Host $input -match $tel_ptr # True/Falseが返されます。 ← 今回の場合、 True |
このような形で正規表現にマッチングしていれば、Trueを返し、
マッチングしていなければ、Falseを返します。
まとめ
以上、PowerShellで正規表現を使って電話番号をマッチングさせてみました。
正規表現、最初は戸惑いや難しくってついていけないといった問題に直面しますが、
慣れてくると、意外と便利ではないか。これは使えるな!となってくると思うので
諦めずに学びを止めないでください。
電話番号以外にも法則性のある文字列であれば、正規表現が作りやすいので
一度読者の方も試していただけたらなと思います。
代表例で言うと、郵便番号やMACアドレス、西暦などでしょうか。
最後までお読みいただき、ありがとうございます。
引き続きよろしくお願いいたします。