如何使用正则表达式匹配包含空格,空值和换行符的日期时间字符串?

时间:2019-04-15 16:18:18

标签: c regex

我正在使用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(&regex, regex_str, REG_EXTENDED);
if (reti)
    fprintf(stderr, "could not compile regex\n");

reti = regexec(&regex, buffer, 0, NULL, 0);
if (!reti){
    char msgbuf[100];
    regerror(reti, &regex, msgbuf, sizeof(msgbuf));
    fprintf(stderr, "Regex match failed: %s\n", msgbuf);
}

正则表达式可以为我编译,但是找不到任何东西。我知道有空字符和换行符。我尝试添加x00+来检查空字符,并添加(\r\n|\r|\n)来检查新行,但是没有成功。我的正则表达式有什么问题?我使用了https://www.regextester.com/,而我的正则表达式在那儿工作,但在C语言中却没有。

2 个答案:

答案 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>