我正在使用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中。
尝试交换月和日
".*\\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)
.*
包含空格的日期时间字符串,null ...
根据定义,C字符串除了终止'\0'
外不能包含空字符。
它只是没有找到任何东西
您似乎误解了regexec()
的返回值 - 您打印错误消息if (!reti)
,但regexec()
为成功匹配返回零。