【发布时间】:2011-01-05 13:27:35
【问题描述】:
我一直在努力使用 C 中的正则表达式(只是 /usr/include/regex.h)。
我有(比方说)数百个正则表达式,其中一个可以匹配输入字符串。 目前我正在这样做(实际上是生成它):数百个 do-while 内部匹配,如果不匹配则中断并转到另一个。一个一个:
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) {
...
}
并且不知道如何做到这一点......
有什么建议吗?
谢谢!
【问题讨论】:
-
我认为设计思想有缺陷。为什么你不能在文件中输入字符串,单列。程序有没有一个接一个地读取它们并与字符串一一比较?
-
另外,如果你只是比较字符串,为什么不使用标准 C 库,特别是:strcmp?
标签: c regex unix posix grouping