如何在POSIX C regexec()中获得所有重复匹配的偏移量?

时间:2012-05-02 19:09:52

标签: c regex posix

我在C中使用regexec()函数。我基本上正在尝试编写一个正则表达式来捕获字符串的部分内容以进行替换。

所以例如,如果我有字符串“Hello $ X”那么我希望regexec给我6,7的范围,因为它是“$ X”。但由于可以有任意数量的替换,我使用正则表达式:

"([^$]*(\\$[A-Za-z][A-Za-z0-9_]*))+"

这应匹配任意文本序列+替换模式。

因此,例如在字符串“First = $ X,Second = $ Y”中,我需要知道$ X出现在偏移6-7处,$ Y出现在偏移17-18处。

我从regexec获得的实际偏移量是: 0,19 8,19 17,19

首先,我知道结束偏移实际上超过了匹配的字符。因此,上述偏移对应于字符串的以下部分:

First=$X, Second=$Y
, Second=$Y
$Y

现在我可以看到这里发生了什么:第一个范围显然是整个匹配,第二个范围是第二个子表达式的第一个完整子匹配。但是从这一点上我感到困惑。为什么它只返回第二个子表达式的第一个子匹配而不是第一个?

我怀疑它与我有重复表达的事实有关,但我不确定我需要做些什么来解决这个问题。如何让它返回所需的偏移?

注意:我将一个128元素的regmatch_t传递给regexec()(nmatch = 128),所以我应该可以获得所有匹配。

1 个答案:

答案 0 :(得分:2)

你对第一和第二意味着什么感到困惑。在这个表达式中:

"([^$]*(\\$[A-Za-z][A-Za-z0-9_]*))+"
 ^_______________________________^    this part

是第一个括号子表达式和

"([^$]*(\\$[A-Za-z][A-Za-z0-9_]*))+"
       ^________________________^    this part

是第二个。如果括号内的子表达式作为*?+{}重复运算符的一部分被多次使用,那么它就是最后一次重复匹配

如果要匹配任意数量的实例,而不是使用正则表达式末尾的+,则只需多次调用regexec,并使用结束偏移量以前的运行作为新的起点。