end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

Regexp::Commonによる正規表現で数値やurlの書式チェック

http://search.cpan.org/dist/Regexp-Common/

Regexp::Commonには、〜::number や 〜::URI::http 等の様々な正規表現が集められています。

Regexp::Common::number

まず、Regexp::Common::numberを使用すれば、数値形式(整数や小数)チェックを簡単に実装することができます。
※1,000のようにカンマ区切もOK。

#!C:/Perl/bin/perl
use strict;
use warnings;
use Regexp::Common qw /number/;

my @test_vals = (-1000,"-1,000",-1,0,1,100,1.0,1.5,"1000A");

for my $org_val ( @test_vals ){
    #整数の数値書式check (-sepでカンマ区切も許可)
    if ($org_val =~ /^$RE{num}{int}{-sep=>',?'}{-keep}$/o){
	print "$org_val\tis number (";
	#-keepで数値全体や符号等をキャプチャー
	print sprintf("entire=%-6s sign=%-1s digits=%-5s",$1,$2,$3),")\n";
	next;
    }
    print "$org_val\tis NOT number\n";
}
$ ./foo2.pl
-1000   is number (entire=-1000  sign=- digits=1000 )
-1,000  is number (entire=-1,000 sign=- digits=1,000)
-1      is number (entire=-1     sign=- digits=1    )
0       is number (entire=0      sign=  digits=0    )
1       is number (entire=1      sign=  digits=1    )
100     is number (entire=100    sign=  digits=100  )
1       is number (entire=1      sign=  digits=1    )
1.5     is NOT number
1000A   is NOT number

Regexp::Common::URI::http

次のサンプルは、http,及びhttpsの書式をチェックしたものです。
※ポイントは、-scheme =>'(https|http)' ですね。

#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
use Regexp::Common qw/URI/;
my @STRS = ('http://www.google.co.jp/',
	    'https://www.google.co.jp/');

main();

sub main {
    for my $str ( @STRS ){
	if ($str =~ /($RE{URI}{HTTP}{-scheme =>'(https|http)'})/o){
	    print "$str is url\n";
	} else {
	    print "$str is not url\n";
	}
    }
}

Regexp::Common::URI::http は、「#」にマッチしない

後日分かりましたが、Regexp::Common::URI の場合、http://example.com/index.html#hoge のように「#」があると、#以降をurlとして認識してくれません。

my $URL_REGREP = '(?:http|https|ftp)://(?:[a-zA-Z0-9-;/?|:@&=+$,_.!~*\'%#]+)';

なので、↑こういう正規表現がいいのかも