尝试正则表达式,简单的例子是行不通的

时间:2017-10-15 15:54:09

标签: c regex

这是我第一次使用正则表达式。我需要的是与u<float>v<float>匹配的东西,但是现在我将满足于匹配u<float>并且浮动在开放单位间隔内的东西。 This整洁的网站让我看到以下表达式:

u0.\d+“匹配你,零,一个点,一个或多个数字”

然后我想在C中尝试,如下所示:

#include <stdio.h>
#include <sys/types.h>
#include <regex.h>

int main(int argc, char **argv)
{
    regex_t regex;
    char *regex_str = "u0.\\d+";
    regcomp(&regex, regex_str, 0);

    char *str = "u0.51";

    int status = regexec(&regex, str, (size_t)0, NULL, 0);
    printf("Status: %d\n", status);

    return 0;
}

现在,根据man regexecregexec在匹配时返回零。以上回报1.出了什么问题?谢谢。

2 个答案:

答案 0 :(得分:1)

您需要转义.,因为它是与任何一个字符匹配的正则表达式元字符。要转义它,请在其前面添加\。但是\是C字符串文字中的元字符,因此您必须转义 ,因此获取\\.

\d是与Perl兼容的正则表达式惯用法,匹配单个数字。它在POSIX正则表达式中不存在 - 因此您必须使用[0-9]。最后,+不是基本正则表达式中的元字符 - 您必须使用REG_EXTENDED。因此我们有

const char *regex_str = "u0\\.[0-9]+";
regcomp(&regex, regex_str, REG_EXTENDED);

答案 1 :(得分:0)

我不确定使用哪种功能,但根据我的经验,您需要使用扩展正则表达式来使加号工作。

\d表示法也不是POSIX RegEx的一部分。它可能是PCRE(Perl兼容的RegEx)的一部分,因此它可能不适用regex.h提供的内容。

试试这段代码:

chat *regex_str = "u0\\.[0-9]+"
regcomp(&regex, regex_str, REG_EXTENDED);