私はCの正規表現(ちょうど/usr/include/regex.h
)に苦しんでいます。Cマッチグループの正規表現
何百もの正規表現があり、そのうちの1つは入力文字列と一致します。 現在、私はこれのように(実際にそれを生成しています)、何百もの中にマッチしていて、マッチングしていないと別のものに行ってしまいます。私がしたいのですがどのような
do {
if (regex_match(str, my_regex1) != MY_REGEX_SUCCESS) DO_FAIL; //break
...
if (sscanf(str, " %d.%d.%d.%d/%d ", &___ip1, &___ip2, &___ip3, &___ip4, &___pref) != 5) DO_FAIL; //break
...
} while (0);
do {
if (regex_match(str, my_regex2) != MY_REGEX_SUCCESS) DO_FAIL; //break
...
...
} while (0);
do {
if (regex_match(str, my_regex3) != MY_REGEX_SUCCESS) DO_FAIL; //break
...
...
} while (0);
のようなものです::
const char * match1 = "^([[:space:]]*)([$]([._a-zA-Z0-9-]{0,118})?[._a-zA-Z0-9])([[:space:]]*)$";
const char * match2 = "^([[:space:]]*)(target|origin)([[:space:]]*):([[:space:]]*)([$]([._a-zA-Z0-9-]{0,118})?[._a-zA-Z0-9])([[:space:]]*):([[:space:]]*)\\*([[:space:]]*)$";
const char * match3 = "^([[:space:]]*)(target|origin)([[:space:]]*):([[:space:]]*)([$]([._a-zA-Z0-9-]{0,118})?[._a-zA-Z0-9])([[:space:]]*)/([[:space:]]*)(([0-2]?[0-9])|(3[0-2]))([[:space:]]*):([[:space:]]*)(([1-9][0-9]{0,3})|([1-5][0-9]{4})|(6[0-4][0-9]{3})|(65[0-4][0-9]{2})|(655[0-2][0-9])|(6553[0-5]))([[:space:]]*)$";
char * my_match;
asprintf(&my_match, "(%s)|(%s)|(%s)", match1, match2, match3);
int num_gr = give_me_number_of_regex_group(str, my_match)
switch (num_gr) {
...
}
は、どのようにそれを行うためのアイデアを持っていない...
を一つずつ助言がありますか?
ありがとうございます!
デザイン思想に欠陥があると思います。なぜあなたはファイル、単一の列に入力文字列を持つことができません。プログラムに順番にそれらを読み込ませ、文字列と1つずつ比較させますか? – chutsu
また、文字列を比較しているだけの場合は、標準のCライブラリを使用してください。具体的には:strcmp? – chutsu