c-如何在pcre2_substitute中设置输出大小



我在C.中使用pcre2_substitute

PCRE2_SPTR pattern;
PCRE2_SPTR replacement;
PCRE2_SPTR subject;
pcre2_code *re;
int errornumber;
int i;
int rc;
PCRE2_SIZE erroroffset;
PCRE2_SIZE *ovector;
size_t subject_length;
size_t replacement_length = strlen((char *)replacement);
pcre2_match_data *match_data;
subject_length = strlen((char *)subject);
PCRE2_UCHAR output[1024] = "";
PCRE2_SIZE outlen = sizeof(output) / sizeof(PCRE2_UCHAR);
re = pcre2_compile(pattern, PCRE2_ZERO_TERMINATED, PCRE2_DOTALL, &errornumber, &erroroffset, NULL);
if (re == NULL)
{
PCRE2_UCHAR buffer[256];
pcre2_get_error_message(errornumber, buffer, sizeof(buffer));
printf("PCRE2 compilation failed at offset %d: %sn", (int)erroroffset, buffer);
}
match_data = pcre2_match_data_create_from_pattern(re, NULL);
rc = pcre2_substitute(re, subject, subject_length, 0, 
PCRE2_SUBSTITUTE_GLOBAL | PCRE2_SUBSTITUTE_EXTENDED, 
match_data, NULL, replacement, replacement_length, output, &outlen);

输出字符串由设置

PCRE2_UCHAR output[1024] = "";

如果字符串长度超过1024个字符,则pcre2_substitute返回-48错误。

在替换之前,我们不知道输出所需的长度。

如何定义足够大的output字符串?

在调用中使用标志PCRE2_SUBSTITUTE_OVERFLOW_LENGTH。如果内存不足,这将导致扫描继续,而不向输出缓冲区实际添加任何内容,以便计算存储在outlengthptr参数中的替换的实际长度。函数仍然返回PCRE2_ERROR_NOMEMORY,因此您可以判断需要更多的内存。如果返回此错误,则使用通过outlengthptrmalloc()存储的值(足够大的输出缓冲区(,然后再次调用。

在提供的输出长度为0的情况下进行第一次调用,然后无条件地进行分配和第二次调用,这是合法的(而且并不罕见(。这是最简单的代码。提供一个可能足够大的缓冲区,并如上所述处理溢出,是避免重复调用的一种方法,从而节省了一点时间。优化的有效性取决于您猜测合理初始缓冲区大小的能力。如果你只使用固定长度的缓冲区,那么第二次调用将只在大的替换上执行,这是另一种说法,即优化只在短的替换上有效(在最不重要的地方(。YMMV。

请参阅man pcre2api中的pcre2_substitute部分,以了解关于该机制的稍长讨论。

相关内容

  • 没有找到相关文章

最新更新