我正在使用C语言中的正则表达式(使用“regex.h”库)。在设置regcomp(...)和regexec(...)的标准调用(和检查)之后,我只能够打印与编译的正则表达式匹配的实际子字符串。根据手册页,使用regexec意味着您将子字符串匹配存储在称为“regmatch_t”的结构中。该结构仅包含rm_so和rm_eo以引用我理解为匹配子字符串在内存中的字符地址,但我的问题是如何仅使用这些偏移量和两个指针提取实际的子字符串并将其存储到数组中(理想情况下是一个二维字符串数组)?
当您只打印到标准输出时,它可以工作,但每当您尝试使用相同的设置但将其存储在字符串/字符数组中时,它会存储最初用于匹配表达式的整个字符串。此外,print语句中的“%.*s”是什么?我想象它本身就是一个正则表达式,可以正确读取字符数组的指针。我只想将匹配的子字符串存储在一个集合中,以便在软件中的其他地方使用它们。
背景:在进入下面代码中的while循环之前,p和p2都是指向要匹配的字符串开头的指针。[编辑:“matches”是一个二维数组,最终用于存储子字符串匹配项,并在您看到的主循环之前进行了预分配/初始化]
当您只打印到标准输出时,它可以工作,但每当您尝试使用相同的设置但将其存储在字符串/字符数组中时,它会存储最初用于匹配表达式的整个字符串。此外,print语句中的“%.*s”是什么?我想象它本身就是一个正则表达式,可以正确读取字符数组的指针。我只想将匹配的子字符串存储在一个集合中,以便在软件中的其他地方使用它们。
背景:在进入下面代码中的while循环之前,p和p2都是指向要匹配的字符串开头的指针。[编辑:“matches”是一个二维数组,最终用于存储子字符串匹配项,并在您看到的主循环之前进行了预分配/初始化]
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);
%.*s
是什么意思?为什么要使用你提供的这两个参数? - 9codeMan9printf()
),但要注意 POSIX 扩展;它们有明显的标记。然而,*
表示有一个int
参数(我应该添加强制转换以确保传递的是int
),指定字符串的最大长度。如果在此之前出现 NUL'\0'
,则会停止,但当字符串较长时,由*
参数指定的长度是最大打印长度。 - Jonathan Lefflerfor (i = 0; i < r.re_nsub; i++) { ... }
。 - Jonathan Leffler