繁体   English   中英

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

[英]regexec in C does not match when \b is used in the expression

我试图在C代码中使用正则表达式在正在读取的文本文件的每一行中找到一个字符串,并且\\b边界似乎不起作用。 该字符串不能是更大字符串的一部分。

失败之后,我还在下面尝试了一些手写的边界表达式,但也无法使其在我的代码中正常工作( 在此处提供源代码):

(?i)(?<=^|[^a-z])MYWORDHERE(?=$|[^a-z])

但是,当我尝试使用诸如a之类a简单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)手册页和用于MacOS X的re_format(7)中进行了介绍。

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

Mac OS X(以及可能的其他BSD衍生系统)还具有REG_ENHANCED格式,该格式不可移植。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM