gpt4 book ai didi

c - 如何获取 POSIX C regexec() 中所有重复匹配项的偏移量?

转载 作者:太空宇宙 更新时间:2023-11-04 03:01:58 28 4
gpt4 key购买 nike

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

最佳答案

您对第一和第二的含义感到困惑。在这个表达式中:

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

是第一个括号子表达式和

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

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

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

关于c - 如何获取 POSIX C regexec() 中所有重复匹配项的偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10420120/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com