我在 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),所以我应该能够获得所有匹配项。