Как я могу использовать PCRE для получения всех групп соответствия?

Этот прием здесь использует тайное table-layout:fixed правило

, Этот CSS должен работать против Вашего демонстрационного HTML:

table {table-layout:fixed}
td {overflow:hidden; white-space:nowrap}

также необходимо определить явную ширину столбцов для <td> с.

Эти table-layout:fixed в правиле говорится, что "Ширины ячеек этой таблицы зависят от того, что я говорю, не от фактического содержания в ячейках". Это обычно полезно, потому что браузер может начать отображать таблицу после того, как это получило первое <tr>. Иначе браузер должен получить всю таблицу, прежде чем это сможет вычислить ширину столбцов.

7
задан Adrien Plisson 12 January 2012 в 09:15
поделиться

1 ответ

Я использую класс для обертывания PCRE, чтобы упростить это, но после pcre_exec овектор содержит индексы подстроки, которые вам нужны для поиска совпадений в исходной строке.

Так что это было бы быть примерно таким:

#include <string>
#include <iostream>
#include "pcre.h"

int main (int argc, char *argv[])
{
    const char *error;
    int   erroffset;
    pcre *re;
    int   rc;
    int   i;
    int   ovector[100];

    char *regex = "From:([^@]+)@([^\r]+)";
    char str[]  = "From:regular.expressions@example.com\r\n"\
                  "From:exddd@43434.com\r\n"\
                  "From:7853456@exgem.com\r\n";

    re = pcre_compile (regex,          /* the pattern */
                       PCRE_MULTILINE,
                       &error,         /* for error message */
                       &erroffset,     /* for error offset */
                       0);             /* use default character tables */
    if (!re)
    {
        printf("pcre_compile failed (offset: %d), %s\n", erroffset, error);
        return -1;
    }

    unsigned int offset = 0;
    unsigned int len    = strlen(str);
    while (offset < len && (rc = pcre_exec(re, 0, str, len, offset, 0, ovector, sizeof(ovector))) >= 0)
    {
        for(int i = 0; i < rc; ++i)
        {
            printf("%2d: %.*s\n", i, ovector[2*i+1] - ovector[2*i], str + ovector[2*i]);
        }
        offset = ovector[1];
    }
    return 1;
}
7
ответ дан 6 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: