当在表达式中使用 \b 时,C 中的 regexec 不匹配
regexec in C does not match when \b is used in the expression
我试图在我的 C 代码中使用正则表达式在我正在阅读的文本文件的每一行中查找一个字符串,但 \b
边界似乎不起作用。该字符串不能是更大字符串的一部分。
在那次失败之后,我还在下面尝试了一些手写的边界表达式,但也无法使其在我的代码中工作(来源 here):
(?i)(?<=^|[^a-z])MYWORDHERE(?=$|[^a-z])
但是当我尝试像 a
这样简单的正则表达式时,它找到了预期的结果。
这是我的简短片段:
#include <regex.h>
void readFromFile(char arr[], char * wordToSearch) {
regex_t regex;
int regexi;
char regexStr [100];
strcpy(regexStr, "\b(");
strcat(regexStr, wordToSearch);
strcat(regexStr, ")\b");
regexi = regcomp(®ex, regexStr, 0);
printf("regexi while compiling: %d\n", regexi);
if (regexi) {
fprintf(stderr, "compile error\n");
}
FILE* file = fopen(arr, "r");
char line[256];
while (fgets(line, sizeof(line), file)) {
regexi = regexec(®ex, line, 0, NULL, 0);
printf("%s\n", line);
printf("regexi while execing: %d\n", regexi);
if (!regexi) {
printf("there is a match.");
}
}
fclose(file);
}
在regcomp
函数中,我也尝试将REG_EXTENDED
作为标志传递,但也没有用。
POSIX 支持的正则表达式记录在 Linux regex(7) manual page and re_format(7) for MacOS X 中。
不幸的是,POSIX 标准正则表达式(有两种标准形式:过时的基本和 REG_EXTENDED
)都不支持 \b
或任何 (?...)
格式,我认为这两种格式都起源于 Perl。
Mac OS X(可能还有其他 BSD 派生系统)另外还有 REG_ENHANCED
格式,这是不可移植的。
您最好的选择是使用其他一些正则表达式库,例如 PCRE。虽然单词 boundaries 本身是一种常规语言,但捕获组的使用使这变得更难,因为 POSIX 甚至不支持非捕获分组,否则你可以使用类似 (^|[^[:alpha:])(.*)($|[^[:alpha:]]*)
的东西,但它肯定会变得很乱。
我试图在我的 C 代码中使用正则表达式在我正在阅读的文本文件的每一行中查找一个字符串,但 \b
边界似乎不起作用。该字符串不能是更大字符串的一部分。
在那次失败之后,我还在下面尝试了一些手写的边界表达式,但也无法使其在我的代码中工作(来源 here):
(?i)(?<=^|[^a-z])MYWORDHERE(?=$|[^a-z])
但是当我尝试像 a
这样简单的正则表达式时,它找到了预期的结果。
这是我的简短片段:
#include <regex.h>
void readFromFile(char arr[], char * wordToSearch) {
regex_t regex;
int regexi;
char regexStr [100];
strcpy(regexStr, "\b(");
strcat(regexStr, wordToSearch);
strcat(regexStr, ")\b");
regexi = regcomp(®ex, regexStr, 0);
printf("regexi while compiling: %d\n", regexi);
if (regexi) {
fprintf(stderr, "compile error\n");
}
FILE* file = fopen(arr, "r");
char line[256];
while (fgets(line, sizeof(line), file)) {
regexi = regexec(®ex, line, 0, NULL, 0);
printf("%s\n", line);
printf("regexi while execing: %d\n", regexi);
if (!regexi) {
printf("there is a match.");
}
}
fclose(file);
}
在regcomp
函数中,我也尝试将REG_EXTENDED
作为标志传递,但也没有用。
POSIX 支持的正则表达式记录在 Linux regex(7) manual page and re_format(7) for MacOS X 中。
不幸的是,POSIX 标准正则表达式(有两种标准形式:过时的基本和 REG_EXTENDED
)都不支持 \b
或任何 (?...)
格式,我认为这两种格式都起源于 Perl。
Mac OS X(可能还有其他 BSD 派生系统)另外还有 REG_ENHANCED
格式,这是不可移植的。
您最好的选择是使用其他一些正则表达式库,例如 PCRE。虽然单词 boundaries 本身是一种常规语言,但捕获组的使用使这变得更难,因为 POSIX 甚至不支持非捕获分组,否则你可以使用类似 (^|[^[:alpha:])(.*)($|[^[:alpha:]]*)
的东西,但它肯定会变得很乱。