【问题标题】:How do you set output size in pcre2_substitute你如何在 pcre2_substitute 中设置输出大小
【发布时间】:2022-09-23 00:17:48
【问题描述】:

我在 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: %s\\n\", (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 字符串?

    标签: c pcre pcre2


    【解决方案1】:

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

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

    请参阅man pcre2api 中的pcre2_substitute 部分,以获得对该机制的稍长讨论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多