Shammer's Philosophy

My private adversaria

正規表現でIPアドレス判定ーC言語ーその4

正規表現でIPアドレス判定ーC言語ーその3 - Shammerismで予想した、regcomp の最後の引数を REG_NOSUB だけにする実装を試してみた。

#include <regex.h>
#include <stdio.h>

int main(int argc, char* args[]){
    if( argc == 2 ){
	regex_t preg;
	int regcompresult;
	regcompresult = regcomp(&preg, "/^(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$/", REG_NOSUB);
	if( regcompresult == 0 ){
	    printf("%s is valid.\n", args[1]);
	}
	else {
	    printf("%s is invalid.\n", args[1]);
	}
    }
    else {
	printf("%s is required only 1 argument.\n", args[0]);
	printf("Usage: %s $1\n", args[0]);
    }
    return 0;
}

実行結果は以下。

$ gcc regex-sample-2.c
$ ./a.out 192
192 is valid.
$ ./a.out 235
235 is valid.
$ ./a.out 255
255 is valid.
$ ./a.out 256
256 is valid.
$ ./a.out aaa
aaa is valid.
$

やっぱり何かおかしい、と思ったが、regcomp の結果で判定していた。regcomp は正規表現コンパイルだ。実際の比較をしているわけじゃない。regcomp でコンパイルした正規表現を使用して、regexec で比較というようにしないといけないのに、肝心の regexec をやっていない。とんだケアレスミスというかボケというか・・・