正则表达式在C中不匹配,但可与在线解释器一起使用

时间:2019-04-12 14:02:40

标签: c regex

我有一个用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 个答案:

答案 0 :(得分:3)

您需要转义反斜杠。更改

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;\\>";

这里是working demo of your corrected code