首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取POSIX C regexec()中所有重复匹配的偏移量?

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

Stack Overflow用户
提问于 2012-05-03 03:09:52
回答 1查看 584关注 0票数 1

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

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

代码语言:javascript
复制
"([^$]*(\\$[A-Za-z][A-Za-z0-9_]*))+"

这应该匹配任意顺序的文本+替换模式。

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

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

首先,我知道结束偏移量实际上是匹配字符之后的一位。因此,上面的偏移量对应于字符串的以下部分:

代码语言:javascript
复制
First=$X, Second=$Y
, Second=$Y
$Y

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

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

注意:我向regexec() (nmatch=128)传递了一个包含128个元素的regmatch_t,因此我应该能够获得所有匹配项。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-03 03:27:44

你对第一和第二是什么意思感到困惑。在此表达式中:

代码语言:javascript
复制
"([^$]*(\\$[A-Za-z][A-Za-z0-9_]*))+"
 ^_______________________________^    this part

是第一个括号中的子表达式,并且

代码语言:javascript
复制
"([^$]*(\\$[A-Za-z][A-Za-z0-9_]*))+"
       ^________________________^    this part

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10420120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档