C Reg Ex Library代码帮助

时间:2011-04-20 08:09:01

标签: c regex

我正在尝试使用C RegEx库。这是我为测试示例模式和字符串而编写的代码。但是,这只会打印出每个字符串的单个模式。例如,在这种情况下,当我运行代码时,它只打印出“asd f g”。它不识别“xty y z”。 我的代码是否有任何问题或者我对库的工作原理有一些根本性的错误。任何和所有的帮助将不胜感激。

int main(int argc, char **argv)
{
    regmatch_t arr[10];
    regex_t *reg=malloc(sizeof(regex_t));
    char *str="\t\t  asd f g  \t   =\t\t  xty y z \t   \t";

    if(regcomp(reg,"[a-z][a-z ]*",REG_EXTENDED | REG_NEWLINE))
        printf("Unsuccessful Compilation\n");
    int i,j;
    int status=regexec(reg,str,10,arr,0);
    if(status)
    {   
        printf("Match Not Found\n");
        return;
    }   
    else
        printf("Match found\n");

    for(i=0;i<10;i++)
    {
        if(arr[i].rm_so!=-1)
            {
                j=arr[i].rm_so;
                printf(":");
                while(j<arr[i].rm_eo)
                {
                    printf("%c",str[j]);
                    j++;
                }
                printf(":\nNewline\n");
            } 
    }   
    return 0;
}

1 个答案:

答案 0 :(得分:1)

我认为你误解了arr的作用。 arr[0]包含匹配项,arr[1]及其后将包含您匹配的子表达式的匹配项(括号内的匹配项)。 regexec只会匹配一次,您需要在循环中重复它,在regexec匹配0时继续,例如,并且比上一个匹配的rm_so更开始下一个匹配。 然后,您只需要arr数组中的一个元素,因为您没有嵌套表达式。

但是,例如如果你想在等号上匹配两边,你可以使用正则表达式([a-z][a-z ]*).*=.*([a-z][a-z ]*)然后在匹配arr[0]之后是一个描述整个匹配的结构,并arr[1]一个描述了=符号之前的那个和arr[2]之后的那个(括号中的子表达式)。因此,如果您只想匹配行作为示例,则可以有效地使用子表达式。