C Reg Ex Библиотечный код справки - PullRequest
1 голос
/ 20 апреля 2011

Я пробую библиотеку C RegEx.Это код, который я написал для тестирования примеров шаблонов и строк.Тем не менее, это только печатает один шаблон на строку.Например, в этом случае, когда я запускаю код, он выводит только «asd fg».Он не распознает "xty yz".Что-то не так с моим кодом или какая-то фундаментальная ошибка в моем понимании того, как работает библиотека.Любая помощь будет принята с благодарностью.

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 Ответ

1 голос
/ 20 апреля 2011

Я думаю, вы неправильно понимаете, что делает 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], одна после (заключенные в скобки подвыражения).Поэтому, если вы хотите сопоставить строки только в качестве примера, вы можете эффективно использовать подвыражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...