我正在使用pcre_exec来应用我从文件中读取的一些正则表达式。由于正则表达式可能包含重复计数,例如[a-z]{1000}
,因此我必须传递3 * 1001个整数的匹配向量才能获得第一个元素,它会告诉我匹配开始/结束的位置。
我只需要开始/结束位置,而不是所有匹配(组)位置。并且pcre_exec
返回0,根据手册的意思是“你需要一个更大的匹配向量”。
我的问题是,如何在不传递任意大的匹配向量的情况下获得开始/结束。或者至少,我怎么知道我需要传递多大的矢量。
答案 0 :(得分:0)
0表示你有一个成功的匹配,但是ovector太小了。只有大约2/3的条目将填充实际值。唯一的例外是前两个值,如果ovector大小为> = 2,将填充这些值。因此,只需传递一个' int ovector [2]'得到开始和结束。
两个注释:
a)如果你通过一个小的ovector,PCRE将分配一个,这个尺寸足够了。看到这个评论:
/ *如果表达式的后向引用多于提供的偏移量,我们会在匹配期间获得临时的工作存储块。否则,我们可以使用提供的向量,将其大小四舍五入为3. * /
的倍数您不能以这种方式减少软件的内存消耗。
b)这不会引入任何捕获括号:[a-z] {1000},因此您不需要传递具有3 * 1001值的数组。偶数([a-z] {1000})或([a-z]){1000}只添加一个捕获括号。