我有一个用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(®exCompiled,regex,REG_EXTENDED))
{
printf("Could not compile regular expression.\n");
fflush(stdout);
};
if (!regexec(®exCompiled,str, 0, NULL, 0)) {
printf("matched");
fflush(stdout);
}
regfree(®exCompiled);
return 0;
}
答案 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;\\>";