Linux下正则表达式

wwwljc 2011-01-22 03:32:40
今天突然想起Linux下的正则的实现,所以网上找了下资料,发现确实存在相应的库,然而在测试代码时发现执行regexec函数之后,总是无法获取多个匹配结果。也就是说,对于某一行文本,虽然行字符串中存在多次匹配,然而在循环调用的时候发现每次只匹配了第一个。这是什么原因?

另外,有什么好的资料可以推荐下?

部分代码如下:

/* 对每一行应用正则表达式进行匹配 */
z = regexec(reg, lineBuffer, nmatch, pm, 0);
if (z == REG_NOMATCH)
continue;
else if (z != 0)
return 0;
/* 输出处理结果 */
for (x = 0; x < nmatch && pm[x].rm_so != - 1; ++x)
printf("The %d match: '%s'\n", x, substr(lineBuffer, pm[x].rm_so, pm[x].rm_eo));
...全文
106 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
q107770540 2011-01-26
  • 打赏
  • 举报
回复
哦。。。原来如此。。
wwwljc 2011-01-25
  • 打赏
  • 举报
回复
也就是说,如果你的正则表达式只有一个子表达式的话,就只需要取matchptr[0]就ok了,而无需通过循环的方式获取其后的值。另一方面,如果需要完成多次匹配,就需要通过循环的方式进行处理了。
justkk 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wwwljc 的回复:]
但是matchptr并不是保存多次匹配的下标,而是在一次匹配过程中的下标信息[/Quote]
不是很明白
那代码应该如何修改呢?
wwwljc 2011-01-22
  • 打赏
  • 举报
回复
还是我自己解答吧。

regexec函数并不能连续执行多次匹配。

分析:

首先regex_t类型的规则表达式可以包含多个子表达式。
其次,regexec函数的原型如下:
int regexec (regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr [], int eflags);
但是matchptr并不是保存多次匹配的下标,而是在一次匹配过程中的下标信息。其中matchptr[0]是主规则表达式的下标信息,而matchptr[i](i > 0)保存的是第i个子规则表达式的下标信息。

上面的代码中,由于将matchptr理解错误,导致循环每次执行一次就退出,而没有解析剩余的字符串。

问题解决。

wwwljc 2011-01-22
  • 打赏
  • 举报
回复
忘记说了,其中
const size_t nmatch = 10;
regmatch_t pm[10];

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧