我正在使用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.hx文件中的正则表达式:
#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(®ex, 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(®ex, 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(®ex, file, 0, NULL, 0) != 0)
{
printf("%s%d wrong:\n, file, line_count);
return EXIT_FAILURE;
}
}
答案 0 :(得分: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(®ex, 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和plop
"^\\s*[a-zA-Z0-9]+(?:\\s+[a-zA-Z0-9]+)*\\s*$"
直接进入regcomp()
这可以帮助解决错误代码:
int res_compile = 0;
if ( (res_compile=regcomp(®ex, 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