Shammer's Philosophy

My private adversaria

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

正規表現でIPアドレス判定ーC言語ーその1 - Shammerismの続き。正規表現を使用するには、

  1. パターンのコンパイル(regcomp)
  2. コンパイルされたパターンを使用しての比較(regexec)

という順番で行われるようだ。
そして、regexec の引数、pmatch や nmatch は、位置情報を取得するもののようだが
正直よくわからない。文章を正規表現検索して、何バイト目かとかそういった情報だろうか。
今回の場合は、引数一つだけをチェックする予定なのであまり関係なさそう。
regexec の最後の引数、eflags に REG_NOSUB を指定することで nmatch や pmatch は無視されるようだ。
nmatch や pmatch を使用しなくても今回は要件を満たせそうなので、REG_NOSUB を使用して試す。

#include <regex.h>
#include <stdio.h>
#include <string.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])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$/", REG_NOSUB | REG_EXTENDED | REG_NEWLINE);
	if( regcompresult == 0 ){
	    size_t nmatch = 0;
	    regmatch_t pmatch[nmatch];
	    int regexecresult;
	    regexecresult = regexec(&preg, args[1], nmatch, pmatch, 0);
	    if( regexecresult == 0 ){
		printf("%s is IP address.\n", args[1]);
	    }
	    else {
		printf("%s is not IP address.\n", args[1]);
	    }
	}
	else {
	    printf("Regcomp failed.\n");
	}
    }
    else {
	printf("Usage: %s $1\n", args[0]);
    }
    return 0;
}

実行結果は以下。

$ gcc ipaddr-check.c
$ ./a.out 192.168.1.254
192.168.1.254 is not IP address.
$ ./a.out aaa
aaa is not IP address.
$

うーん、正しく動いていない。引き続き確認が必要。