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

问题描述 投票:2回答:2

我正在使用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中。

c regex
2个回答
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)
 .* 

0
投票

包含空格的日期时间字符串,null ...

根据定义,C字符串除了终止'\0'外不能包含空字符。

它只是没有找到任何东西

您似乎误解了regexec()的返回值 - 您打印错误消息if (!reti),但regexec()为成功匹配返回零。

© www.soinside.com 2019 - 2024. All rights reserved.