gpt4 book ai didi

c - 当在表达式中使用\b 时,C 中的 regexec 不匹配

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:56 24 4
gpt4 key购买 nike

我试图在我的 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(&regex, 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(&regex, 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)手册页和 re_format(7)适用于 MacOS X。

不幸的是,POSIX 标准正则表达式(有两种标准形式:过时的基本和 REG_EXTENDED)既不支持 \b 也不支持任何 (?...) 格式,我认为这两种格式都起源于 Perl。

Mac OS X(可能还有其他 BSD 衍生系统)还有 REG_ENHANCED 格式,这种格式不可移植。

您最好的选择是使用其他一些正则表达式库,例如 PCRE .虽然单词边界本身是一种常规语言,但捕获组的使用使这变得更加困难,因为 POSIX 甚至不支持非捕获分组,否则你可以使用类似 (^|[^[:alpha:] )(.*)($|[^[:alpha:]]*) 但它肯定会变得非常困惑。

关于c - 当在表达式中使用\b 时,C 中的 regexec 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46747881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com