我在 C 中使用正则表达式(使用“regex.h”库)。在为 regcomp(...) 和 regexec(...) 设置标准调用(和检查)之后,我只能设法打印与我编译的正则表达式匹配的实际子字符串。根据手册页,使用 regexec 意味着您将子字符串匹配存储在称为“regmatch_t”的结构中。该结构仅包含 rm_so 和 rm_eo 来引用我所理解的内存中匹配子字符串的字符地址,但我的问题是我如何才能使用这些偏移量和两个指针来提取实际的子字符串并将其存储到一个数组(理想情况下是一个二维字符串数组)?
当您仅打印到标准输出时它可以工作,但每当您尝试使用相同的设置但将其存储在字符串/字符数组中时,它会存储最初用于匹配表达式的整个字符串。此外,打印语句中的“%.*s”是什么?我想它本身就是一个正则表达式,可以正确读取指向字符数组的指针。我只想将匹配的子字符串存储在集合中,以便可以在软件的其他地方使用它们。
背景:p 和 p2 都是指向要匹配的字符串开头的指针,然后在下面的代码中进入 while 循环:[编辑:“matches”是一个 2D 数组,旨在最终存储子字符串匹配项,并已预分配/初始化在你看到下面的主循环之前]
int ind = 0;
while(1){
regExErr1 = regexec(&r, p, 10, m, 0);
//printf("Did match regular expr, value %i\n", regExErr1);
if( regExErr1 != 0 ){
fprintf(stderr, "No more matches with the inherent regular expression!\n");
break;
}
printf("What was found was: ");
int i = 0;
while(1){
if(m[i].rm_so == -1){
break;
}
int start = m[i].rm_so + (p - p2);
int finish = m[i].rm_eo + (p - p2);
strcpy(matches[ind], ("%.*s\n", (finish - start), p2 + start));
printf("Storing: %.*s", matches[ind]);
ind++;
printf("%.*s\n", (finish - start), p2 + start);
i++;
}
p += m[0].rm_eo; // this will move the pointer p to the end of last matched pattern and on to the start of a new one
}
printf("We have in [0]: %s\n", temp);