在表达式

时间:2017-10-14 18:18:04

标签: c regex word-boundary

我正在尝试在我的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作为标记传递,但它也无效。

1 个答案:

答案 0 :(得分:3)

POSIX支持的正则表达式记录在Linux regex(7)手册页中,re_format(7)表示MacOS X.

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

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

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