鶏頭のプログラム

Ruby, Javascript, C言語, SQLなどのプログラミング

鬼車(C言語)

先日どうしても業務で正規表現を使用したい場面に遭遇して(しかもC言語で)
なんか手軽なライブラリはないものかとさがしていたらありました。
鬼車

しかもRuby正規表現で使っているのでこれはいいと思って使ってみた。
参考は
http://www.geocities.jp/kosako3/oniguruma/doc/API.ja.txt

#include "oniguruma.h"

regex_t *InitRegular(const char *pattern){
	int return_code = 0;
	OnigErrorInfo einfo;
	regex_t *reg;
	OnigEncoding code = ONIG_ENCODING_UTF8; // SJISの時はONIG_ENCODING_SJIS;

	return_code = onig_new(&reg, pattern, pattern + strlen(pattern),ONIG_OPTION_DEFAULT, code, 
	ONIG_SYNTAX_DEFAULT, &einfo);
	if(return_code != ONIG_NORMAL){
		return NULL;
	}
	return reg;
}

void PrintRegular(regex_t *reg, const char *str){
	int r;
	char *start, *range, *end;
	OnigRegion *region = onig_region_new();
	end = str + strlen(str);
	start = str;
	range = end;
	r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE);
	while (r >= 0) {
		int match_beg = 0;
		int match_end = 0;
		int i, j, len;
		printf("位置 %d でマッチ\n", r);
		for (i = 0; i < region->num_regs; i++) {
			char *match_str;
			match_beg = region->beg[i];
			match_end = region->end[i];
			len = match_end - match_beg;
			match_str = (char*)malloc(len + 1);
			if (!match_str) {
				printf("メモリ確保に失敗しました\n");
				return 1;
			}
			for (j = 0; j < len; j++) {
				match_str[j] = str[match_beg + j];
			}
			match_str[j] = '\0';

			printf("%d: %s (%d-%d)\n", i, match_str, match_beg, match_end - 1);
			free(match_str);
		}
		if((str + match_end + 1) >= end){ break; }
		onig_region_clear(region);
		r = onig_search(reg, str, end, str + match_end + 1, range, region, ONIG_OPTION_NOTBOL);
	}
	onig_region_free(region, 1);	
}

void FinalRegular(FwRegular *reg){
	onig_free(reg);
	onig_end();
}

int main(){
	regex_t *reg = InitRegular("(\"(?:[^\"]|\"\")+\"|[^,]+)");
	PrintRegular(reg, "a,b,\"c,d\"\"e\",f,g");
	FinalRegular(reg);
}

基本のソースはこんな感じで動くとおもいます。
サンプルコードはCSVをばらばらにしてみました。

今後、開発が非常に楽になりそうです。