簡體   English   中英

替換 C 中 pcre2_substitute 中的所有匹配項

[英]Replace all matches in pcre2_substitute in C

我將第一次出現的匹配替換為pcre2_substitute

#define PCRE2_CODE_UNIT_WIDTH 8

#include <stdio.h>
#include <string.h>
#include <pcre2.h>
int main(int argc, char **argv)
{
    PCRE2_SPTR pattern = "(\\d+)";
    PCRE2_SPTR subject = "1 something 849 for 993";
    PCRE2_SPTR replacement = "XXX";

    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, 0, &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, 0, match_data, NULL, replacement, 
         replacement_length, output, &outlen);
    printf("Output: %s", output);
    return 0;
}

我知道我應該在循環中重復pcre2_substitute以替換下一個匹配項,但我不確定將output作為下一步的subject的最安全方法。

您可以使用擴展選項PCRE2_SUBSTITUTE_GLOBAL一次調用pcre2_substitute來替換所有內容:

rc = pcre2_substitute(re, subject, subject_length, 0,
    PCRE2_SUBSTITUTE_GLOBAL | PCRE2_SUBSTITUTE_EXTENDED,
    match_data, NULL, replacement, replacement_length, output, &outlen);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM