Как обрабатывать регулярные выражения? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть список данных, которые необходимо проанализировать.Данные выглядят следующим образом:

Элемент1 \ t OptionalElement2 \ t OptionalElement3 \ r \ n

Элементы (значения) разделены символами '\ t' и OptionalElement2 и /или OptionalElement3 может появиться или не появиться.Это означает, что я мог бы иметь:

Element1 \ t \ t OptionalElement3 \ r \ n

или

Element1 \ t OptionalElement2 \r \ n

или

Element1 \ r \ n

Я хотел прочитать значения с регулярным выражением в C или C ++язык, использующий sscanf, с

while (counter < 3) {
    memset(buffer[counter], '\0', sizeof(buffer[counter])); 
    counter++;
}
sscanf(toParse, "%[^\t]%[^\t\r\n]%[^\t\r\n]\r\n", buffer[0], buffer[1], buffer[2])

Но тогда, когда OptionalElement2 пуст, буфер [1] получает значения OptionalElement3 вместо массива '\ 0'.Есть ли способ правильно обработать это, чтобы, когда значения не являются выходными, их соответствующие контейнеры также были пустыми?

Спасибо.

1 Ответ

0 голосов
/ 27 ноября 2018

Мой главный вопрос: вы используете C или C ++?Результат и соответствующий / ожидаемый ответ будут даны с правильной информацией.

Поскольку вы говорите и о C ++, я приведу пример кода для управления этим с использованием библиотеки, предоставляемой на C ++ (начиная с C ++11 лет).Имейте в виду, что, как и в C ++, я не использую sscanf (...), поэтому он может или не может ответить на ваш запрос, если вы собираетесь использовать sscanf для вашего решения.

Вот пример кода:

#include <regex>
#include <iostream>

int main ()
{
    std::string val{"Element1 \t OptionalElement2 \t OptionalElement3"};
    //std::string val{"Element1 \t OptionalElement2"};
    //std::string val{"Element1"};

    // the match object
    std::smatch m;
    // declare regular expression for matching (note that optional elements are marked as optional with the ? after
    // closing parenthesis
    std::regex myreg("^\\s*([\\w\\d]+)\\s*([\\w\\d]+)?\\s*([\\w\\d]+)?\\s*$");

    // check if there the match between our pattern and the content
    if( std::regex_match(val, m, myreg) )
    {
        // here there will be 4 values available
        // m[0]: the full line
        // m[1]: element 1
        // m[2] : Optional element 2 or an empty string if not found
        // m[3] : Optional element 3 or an empty string if not found
        std::clog << "Size of results:" << m.size() << "\n";

        // display one element
        std::cout << "Element 1: " << m[1] << "\n";
        if( m[2].matched)
            std::cout << "Element 2: " << m[2] << "\n";

        if( m[3].matched)
            std::cout << "Element 3: " << m[3] << "\n";

        // if you want to display all matched elements, here is the code
        /*for (const auto& entry: m)
        {
            if( entry.matched)
                std::clog << "Found: " << entry.str() << "\n";
        }*/
    }

    return 0;
}

Опять же, учитывая имеющуюся в моем распоряжении информацию, она может не ответить на ваш запрос, но, по крайней мере, у вас сейчас есть рабочая версия C ++.

...