0

我正在使用 fgets 读取文件。我需要根据正则表达式检查文件的每一行。如果存在非字母数字字符,则需要退出程序并显示行号和“坏”字符。正在发生的事情是它在“坏”角色之前被踢出。这是我的 .dat 文件:

howard jim dave 
joe
(
Maggie

我的程序输出是:

file opened
Digit: howard jim dave 
is not alphanumeric on line: 1
Exiting program!
File closed

应该发生的是它应该在第 3 行被踢出,正如你所看到的那样,这并没有发生。

这是我的 main.h 文件中的正则表达式:

#ifndef MAIN_H
#define MAIN_H

#ifdef  __cplusplus
extern "C" {
#endif

#define BUFF 1024
#define to_find "^[a-zA-Z0-9]+$"

这是我的fileCheck.c

#include "main.h"

int fileCheck(FILE *fp)
{

    int ret_val;
    int line_count = 0;
    char file[BUFF];
    regex_t regex;

    if (regcomp(&regex, to_find, REG_EXTENDED) != 0)
    {
        fprintf(stderr, "Failed to compile regex '%s'\n", to_find);
        return EXIT_FAILURE;
    }

    if (fp != NULL)
    {
        while (fgets(file, BUFF, fp))
        {
            line_count++;

            if ((ret_val = regexec(&regex, file, 0, NULL, 0)) != 0)
            {
                printf("Digit: %s is not alphanumeric on line: %d\n", file, line_count);
                printf("Exiting program!\n");
                return EXIT_FAILURE;
            }
        }
    }

}

我不确定“\n”字符是否是问题所在。我认为不是。我很清楚 isalnum() 但我的任务是使用正则表达式。这个问题的可能解决方案是什么?谢谢你的建议。

编辑:我想提一下,当我使用 fscanf 而不是 fgets 时,上面的正则表达式工作得很好。更改的原因是我需要计算每一行。如果我是正确的, fscanf 会忽略换行符。我需要一些方法来计算换行符。是否可以使用 fscanf 计算一个新的?我原来的文件读取循环是:

while (fscanf(fp, "%11023s", file) != EOF
{
    line_count++;
    if (regexec(&regex, file, 0, NULL, 0) != 0)
    {
        printf("%s%d wrong:\n, file, line_count);
        return EXIT_FAILURE;
    }
}
4

1 回答 1

1

howard jim dave包含空格。

Edit3:
我专注于仅查找有效行的匹配的原因是您似乎
正在使用一个简单的测试场景,以后会更复杂。
但是,如果这正是您所需要的,那么真正的解决方案就是寻找
一个非字母数字的非空白字符。
如果您使用的正则表达式风格需要从头到尾匹配,
这将不起作用。

  #define to_find "[^a-zA-Z0-9\\s]" 
     or, 
  #define to_find "[^a-zA-Z0-9\\ \\t\\f\\r\\n]"

   . . .
     Then down here if the regex matches, it found non alpha numeric

  if ( regexec(&regex, file, 0, NULL, 0)) == 0 )
  {
      printf("Digit: %s is not alphanumeric on line: %d\n", file, line_count);
      printf("Exiting program!\n");
      return EXIT_FAILURE;
  }

Edit2:
这是一个 Posix 引擎吗?regcomp() 返回什么错误代码?您应该将 REG_EXTENDED 设置为 cflag 参数之一。
不幸的是,该(?: pattern )构造是扩展规范。

还不如把厨房水槽扔给它
REG_EXTENDED | REG_NEWLINE

试试这些 flaqs 并
"^\\s*[a-zA-Z0-9]+(?:\\s+[a-zA-Z0-9]+)*\\s*$"直接进入 regcomp()

这可以帮助解决错误代码:

 int res_compile = 0;
 if ( (res_compile=regcomp(&regex, to_find, REG_EXTENDED) ) != 0)
 {
   fprintf(stderr, "Failed to compile regex '%s'\nError code:  %d\n", to_find, res_compile);
 }

原文:也许你需要

 # ^\s*[a-zA-Z0-9]+(?:\s+[a-zA-Z0-9]+)*\s*$

 ^ 
 \s* 
 [a-zA-Z0-9]+ 
 (?: \s+ [a-zA-Z0-9]+ )*
 \s* 
 $

或者

 # \A[^\S\r\n]*[a-zA-Z0-9]+(?:[^\S\r\n]+[a-zA-Z0-9]+)*\s*\z

 \A 
 [^\S\r\n]* 
 [a-zA-Z0-9]+ 
 (?: [^\S\r\n]+ [a-zA-Z0-9]+ )*
 \s*
 \z
于 2013-09-15T17:43:36.687 回答