【发布时间】:2009-09-17 00:43:35
【问题描述】:
在我的 OS X 10.5.8 机器上,使用 regcomp 和 regexec C 函数来匹配扩展的正则表达式“(()|abc)xyz”,我找到了字符串“abcxyz”的匹配项,但仅从偏移量 3 到偏移量 6。我的期望是匹配整个字符串,并且我会看到字符串的初始“abc”部分的子匹配。
当我在同一台机器上使用 awk 尝试相同的模式和文本时,它会显示整个字符串的匹配项。
我希望我对正则表达式的有限经验可能是问题所在。有人可以解释发生了什么吗?我的正则表达式有效吗?如果是这样,为什么它不匹配整个字符串?
我知道“((abc){0,1})xyz”可以用作替代方案,但是感兴趣的模式是从另一种模式格式自动生成的,消除“()”的实例是额外的工作如果可能,我想避免。
作为参考,我传递给 regcomp 的标志仅包含 REG_EXTENDED。我将一组空标志 (0) 传递给 regexec。
【问题讨论】:
-
出于兴趣,你可以试试“(abc|())xyz”吗?
-
使用
(abc)?会起作用,而且比你使用的要短。 -
出于对这是否真的是由于 UB 或错误引起的兴趣,您可以尝试
((c)|abc)xyz并查看它匹配的范围吗?我怀疑乔纳森这次是对的,但我从 OSX 了解到,首先考虑实现存在错误的可能性通常是明智的......