如何在C中使用regexec匹配数字

时间:2014-04-05 21:26:12

标签: c regex

我正在尝试检查字符串是否是有效数字。有效数字类似于123或123.456。我尝试与[0-9]+(\\.[0-9]+)?匹配,但这不起作用。

这是我到目前为止所拥有的。

#include <stdio.h>
#include <regex.h>

int main()
{
    const char* string = "123";
    regex_t preg;

    regcomp(&preg, "[0-9]+(\\.[0-9]+)?", 0);

    if(regexec(&preg, string, (size_t)0, NULL, 0) == 0){
        printf("valid number\n");
    }
    else{
        printf("not valid number\n");
    }

    regfree(&preg);

    return 0;
}

当我运行它时,它返回“无效数字”。

这是更大程序的一部分,我刚刚提取了正则表达式部分以简化我的问题。

2 个答案:

答案 0 :(得分:3)

阅读regcomp(3)&amp; regex(7)手册页。您需要REG_EXTENDED标记,因为您在正则表达式中使用?

int errcode = regcomp(&preg, "[0-9]+(\\.[0-9]+)?", REG_EXTENDED);
if (errcode) {
   char errmsg[80];
   memset (errmsg, 0, sizeof(errmsg));
   regerror(errcode, &preg, errmsg, sizeof(errmsg));
   fprintf(stderr, "regexp failure: %s\n", errmsg);
   exit(EXIT_FAILURE);
}

但是对于您的特定测试strtod(3)可能就足够了(并且它给出了数字和结束指针,因此请检查结束指针是否指向终止空字节)。

答案 1 :(得分:1)

如果您正在尝试检查字符串是否代表某个数字,您可以尝试转换为double并查看是否成功,从根本不需要使用正则表达式。例如,以下程序测试字符串是否可以转换为数字:

#include <stdlib.h>

int is_number(const char *s)
{
    char *end;

    (void)strtod(s, &end);
    return end==s;
}

唯一的问题是,如果可以转换字符串的开头,它将成功。要测试整个字符串是否可转换,您必须执行以下操作:

#include <string.h>
#include <stdlib.h>

int is_number(const char *s)
{
    char *end;

    (void)strtod(s, &end);
    return end==s+strlen(s);
}

或者,或者:

#include <stdlib.h>

int is_number(const char *s)
{
    char *end;

    (void)strtod(s, &end);
    return *end=='\0';
}