我正在使用fgets
遍历文件,并且试图查看一行是否符合特定条件。
基本上,我的循环是
#define BUFSIZE = 4096;
FILE *txt_file = fopen("some_file.txt", "r");
char buffer[BUFSIZE] = {'\0'};
int i;
while (fgets(buffer, BUFSIZE, txt_file)){
//some logic
// Reset buffer string
for (i=0; i<BUFSIZE; i++)
buffer[i] = '\0';
}
我有各种日期时间字符串,可以采用以下形式:
yyyy-dd-mm hh:mm:ss
yyyy-d-mm hh:mm:ss
yyyy-dd-m hh:mm:ss
`yyyy-d-m hh:mm:ss
但是,日期时间字符串可能在空格前也可能不在空格前,并且由于我使用\0
的方式,它们将具有空字符(我指的是buffer
字符)。
我正在使用以下正则表达式来匹配上述形式之一:
.*\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01]).*
(hh:mm:ss部分无关紧要。)如果我将其放入C可以解释的格式,
char *regex_str = ".*\\d{4}\\-(0?[1-9]|1[012])\\-(0?[1-9]|[12][0-9]|3[01]).*"
问题是,当我尝试找到匹配项时,我一直得到No Match
。基本上在我的while
循环中,我正在尝试:
int reti = regcomp(®ex, regex_str, REG_EXTENDED);
if (reti)
fprintf(stderr, "could not compile regex\n");
reti = regexec(®ex, buffer, 0, NULL, 0);
if (!reti){
char msgbuf[100];
regerror(reti, ®ex, msgbuf, sizeof(msgbuf));
fprintf(stderr, "Regex match failed: %s\n", msgbuf);
}
正则表达式可以为我编译,但是找不到任何东西。我知道有空字符和换行符。我尝试添加x00+
来检查空字符,并添加(\r\n|\r|\n)
来检查新行,但是没有成功。我的正则表达式有什么问题?我使用了https://www.regextester.com/,而我的正则表达式在那儿工作,但在C语言中却没有。
答案 0 :(得分:0)
尝试交换月份和日期
".*\\d{4}-(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012]).*"
===============
.*
\d{4}
-
( # (1 start), Day
0? [1-9]
|
[12] [0-9]
|
3 [01]
) # (1 end)
-
( # (2 start), Month
0? [1-9]
|
1 [012]
) # (2 end)
.*
答案 1 :(得分:0)
包含空格的日期时间字符串,为null
根据定义,C字符串不能包含空字符,但结尾的'\0'
除外。
什么都没找到
似乎您误解了regexec()
的返回值-打印了一条错误消息if (!reti)
,但是 regexec()
对于成功的匹配返回零。。 / p>