我正在尝试检查字符串是否是有效数字。有效数字类似于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;
}
当我运行它时,它返回“无效数字”。
这是更大程序的一部分,我刚刚提取了正则表达式部分以简化我的问题。
答案 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';
}