アットウィキロゴ
久々の更新ですが、今日は正規表現についてのこぼれ話です。

ネットワークプログラミングってちゃんとやったことがなかったので、やってみようと思い立ち、
以下のサイトを参照してお勉強してみることにしました。
http://x68000.q-e-d.net/~68user/net/c-http-1.html

※作者様、ありがとうございます!勉強させていただきますm(_ _)m

この時、Test Firstライクに、自分でテストコードとそれをmake時に自動実行して結果を出力するようにmakefileを書いてます。あ、C言語です。

話が逸れました。

で、元のコードではURLを起動時引数にもらって実行してますが、作ってるコートではhttpClientクラス(のようなもの)の初期化関数にURLを渡します。
この時、テストコードを書くと必然的にURLをチェックするコートが必要なことがわかるので、実装しようとしたのですが、意外にURLかどうかをチェックするのって面倒だった。。。


そこで正規表現を使うことにしたのですが、正規表現でURLってどうやって検索すればいいんだ????


単純にhttp://www.google.co.jpとかなら、例えばこんな表現でいけますよね。

^http://.+

でもこれだと、ポートが指定された時にそのポート番号が適切かどうかが判断できない。
確かに、ポート番号を一度抽出してから数値として比較すれば一発ですが、そのためだけに、一度抽出するのはちょっと・・・と思ってしまいました。

そこで、美しくないですが、ポート番号は1-5桁の数字で5桁の時は65535が最大値なので、以下のようにすればこの条件にマッチする数字が検索できると思いました。

([1-6][0-5]{2}[0-3][0-5]|[1-9][0-9]{3}|[1-9]{2}|[0-9])


で、これと組み合わせて、ポート番号が指定されない場合もあるので、選択で両方のパターンを記述するとこうなります。

^http://([^:]+|[^:]+:([1-6][0-5]{2}[0-3][0-5]|[1-9][0-9]{3}|[1-9]{2}|[0-9])(/[^:0-9]*|[^:0-9]*))


これを使って検索すると、なんと、部分一致してしまうので、http://www.hogehoge.com:65536 とかでも一致したことになってしまいます。

完全一致にするにはどうすればいいかと言うと、行末まで一気に指定してしまえばいいです。

^http://([^:]+|[^:]+:([1-6][0-5]{2}[0-3][0-5]|[1-9][0-9]{3}|[1-9]{2}|[0-9])(/[^:0-9]*|[^:0-9]*))$


これで、ひとまず希望する検索結果が得られました。今のところ(^^;


今後テストを追加していけば不備が見つかるかもしれないので、その時に修正して実装していこうと思います。
こういうのをぱっと思い付かないあたりが、経験値の低さを物語っているというか、底辺らしいですねw



名前:
コメント:
最終更新:2014年03月11日 23:06