URLにマッチする正規表現

https?://(([-_.!~*'()a-zA-Z0-9;:&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*@)?((([a-zA-Z0-9]|
[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.)*([a-zA-Z]|[a_-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9
])\.?|[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)(:[0-9]*)?(/([-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-
9A-Fa-f][0-9A-Fa-f]_)*(;([-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)*(/
([-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*(;([-_.!~*'()a-zA-_Z0-9:@&=+
$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)*)*)?(\?([-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f]
[0-9A-Fa-f])*)?(#([-_.!~*'()a-zA-Z0-9;/?:@&_=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)?

VBRegexクラスでURLをチェックするための正規表現
基本は,大崎 博基さんのページに掲載されているPerl正規表現のうち,VBで使えない表記を除いただけ。

大崎さんによると,上の正規表現の元となるPerlコードはRFC 2616(HTTP)や1738(URL)に忠実に書かれているようだが,忠実であるが故に,実務でValidatorとして使うには不足している内容もある。たとえば:

  • RFC 1034や2181(どちらもDNS)によれば,ドメイン名に用いるラベルの文字数は63文字(オクテット)以下であるが,この正規表現では,その制限がない。
  • また,現行のTCP/UDPのポート番号は16ビットの符号なし整数なので,65536以上のポートは存在しないが,RFC 2616通りのURLでは6桁だろうが7桁だろうが論理的には無限大のポート番号が指定できてしまう。

VB 2005で利用できる正規表現については,以下の書籍が参考になった:

プログラミング MS VISUAL BASIC2005 言語編 (マイクロソフト公式解説書)

プログラミング MS VISUAL BASIC2005 言語編 (マイクロソフト公式解説書)