你如何用正则表达式捕获一个组?
问题描述:
我想从另一个使用正则表达式提取字符串。 我使用POSIX正则表达式函数(regcomp, regexec
...),我在拍摄一组失败...你如何用正则表达式捕获一个组?
例如,我们的模式是一样简单的东西"MAIL FROM:<(.*)>"
(与REG_EXTENDED
CFLAGS)
我想“<”之间捕捉一切和“>”
我的问题是regmatch_t
给我的整个模式的边界(MAIL FROM:< ...>),而不是括号之间只是什么...
我错过了什么?
由于提前,
编辑:一些代码
#define SENDER_REGEX "MAIL FROM:<(.*)>"
int main(int ac, char **av)
{
regex_t regex;
int status;
regmatch_t pmatch[1];
if (regcomp(®ex, SENDER_REGEX, REG_ICASE|REG_EXTENDED) != 0)
printf("regcomp error\n");
status = regexec(®ex, av[1], 1, pmatch, 0);
regfree(®ex);
if (!status)
printf( "matched from %d (%c) to %d (%c)\n"
, pmatch[0].rm_so
, av[1][pmatch[0].rm_so]
, pmatch[0].rm_eo
, av[1][pmatch[0].rm_eo]
);
return (0);
}
输出:
$./a.out "MAIL FROM:<abcd>$"
matched from 6 (M) to 22 ($)
溶液:
如RarrRarrRarr说,指数确实在pmatch[1].rm_so
pmatch[1].rm_eo
和
因此regmatch_t pmatch[1];
变得regmatch_t pmatch[2];
和regexec(®ex, av[1], 1, pmatch, 0);
变得regexec(®ex, av[1], 2, pmatch, 0);
谢谢:)
答
regmatch_t结构的pmatch阵列的第0个元素将包含正如您已经注意到的,整个字符串的边界匹配。在您的示例中,您对索引1处的regmatch_t感兴趣,而不是索引0,以便通过子表达式获取有关字符串匹配的信息。
如果您需要更多帮助,请尝试编辑您的问题以包含实际的小代码示例,以便人们可以更轻松地发现问题。
答
下面是演示捕获多个组的代码示例。
你可以看到组'0'是整个匹配,后面的组是括号内的部分。
请注意,这将只捕获源字符串中的第一个匹配项。 Here's a version that captures multiple groups in multiple matches。
#include <stdio.h>
#include <string.h>
#include <regex.h>
int main()
{
char * source = "___ abc123def ___ ghi456 ___";
char * regexString = "[a-z]*([0-9]+)([a-z]*)";
size_t maxGroups = 3;
regex_t regexCompiled;
regmatch_t groupArray[maxGroups];
if (regcomp(®exCompiled, regexString, REG_EXTENDED))
{
printf("Could not compile regular expression.\n");
return 1;
};
if (regexec(®exCompiled, source, maxGroups, groupArray, 0) == 0)
{
unsigned int g = 0;
for (g = 0; g < maxGroups; g++)
{
if (groupArray[g].rm_so == (size_t)-1)
break; // No more groups
char sourceCopy[strlen(source) + 1];
strcpy(sourceCopy, source);
sourceCopy[groupArray[g].rm_eo] = 0;
printf("Group %u: [%2u-%2u]: %s\n",
g, groupArray[g].rm_so, groupArray[g].rm_eo,
sourceCopy + groupArray[g].rm_so);
}
}
regfree(®exCompiled);
return 0;
}
输出:
Group 0: [ 4-13]: abc123def
Group 1: [ 7-10]: 123
Group 2: [10-13]: def
谢谢,这是问题:) – Sylvain 2010-04-05 06:52:16