Regex не соответствует в c, но работает с онлайн-переводчиком - PullRequest
2 голосов
/ 12 апреля 2019

У меня есть регулярное выражение, которое я протестировал с https://regexr.com/,, где оно работает правильно.Но в c он не находит соответствия.

Мой код ниже;Я удалил все ненужное.

#include <string.h>
#include <stdio.h>
#include <stdlib.h> 
#include <regex.h>  
int main ()
{
    char * str = "<sql db=../serverTcp/Testing.db query=SELECT * From BuyMarsians;\>";
    char * regex = "<sql\s+db=(.+)\s+query=(.+;)\s*\\>";
    regex_t regexCompiled;

    if (regcomp(&regexCompiled,regex,REG_EXTENDED))
    {
        printf("Could not compile regular expression.\n");
        fflush(stdout);
    };
    if (!regexec(&regexCompiled,str, 0, NULL, 0)) {
    printf("matched");
        fflush(stdout);
    }
    regfree(&regexCompiled);
  return 0;
}

1 Ответ

3 голосов
/ 12 апреля 2019

Тебе нужно убежать от обратной косой черты.Измените

char * regex = "<sql\s+db=(.+)\s+query=(.+;)\s*\\>";

на

char * regex = "<sql\\s+db=(.+)\\s+query=(.+;)\\s*\\\\>";

Обратите внимание, что это крайне неэффективно.Гораздо более эффективное регулярное выражение использует не жадное количественное выражение, с ?:

<sql\s+db=(.+?)\s+query=(.+;)\s*\\>
//           ^ key change

, которое становится:

char * regex = "<sql\\s+db=(.+?)\\s+query=(.+;)\\s*\\\\>";

Также обратите внимание: ваша строка для сопоставления также включает \,Вам тоже нужно убежать от него:

char * str = "<sql db=../serverTcp/Testing.db query=SELECT * From BuyMarsians;\\>";

Вот рабочая демонстрация вашего исправленного кода .

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