[英]How do you set output size in 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: %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);
output 字符串由設置
PCRE2_UCHAR output[1024] = "";
如果字符串長度超過 1024 個字符, pcre2_substitute
將返回-48
錯誤。
在替換之前,我們不知道 output 所需的長度。
如何定義足夠大的output
字符串?
在您的通話中使用標志PCRE2_SUBSTITUTE_OVERFLOW_LENGTH
。 如果 memory 用完,這將導致掃描繼續,而不實際向 output 緩沖區添加任何內容,以便計算存儲在outlengthptr
參數中的實際長度。 function 仍然返回PCRE2_ERROR_NOMEMORY
,因此您可以看出需要更多 memory 。 如果收到此錯誤返回,則使用通過outlengthptr
存儲的值malloc()
足夠大的 output 緩沖區,然后再次調用。
使用提供的 output 長度為 0 進行第一次調用是合法的(並且並不少見),然后無條件地進行分配和第二次調用。 這是最簡單的代碼。 提供一個可能足夠大的緩沖區並如上所述處理溢出是一種避免重復調用的方法,從而節省了一些時間。 該優化的有效性取決於您猜測合理的初始緩沖區大小的能力。 如果您只使用固定長度的緩沖區,則第二次調用將僅在大替換時執行,這是另一種說法,即優化僅對短替換(最不重要)有效。 YMMV。
有關此機制的稍長討論,請參見man pcre2api
中的pcre2_substitute
部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.