如何处理正则表达式?

时间:2018-11-27 11:32:20

标签: c++ c regex scanf

我有一个需要解析的数据列表。 数据如下:

  

Element1 \ t OptionalElement2 \ t OptionalElement3 \ r \ n

元素(值)用'\ t'分隔,并且OptionalElement2和/或OptionalElement3可能出现也可能不出现。这意味着我可以:

  

Element1 \ t \ t可选Element3 \ r \ n

  

Element1 \ t可选Element2 \ r \ n

  

Element1 \ r \ n

我想使用sscanf和

使用C或C ++语言的正则表达式读取值。
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为空时,buffer [1]获取OptionalElement3的值,而不是'\ 0'数组。 有没有一种方法可以正确处理此问题,以便在不存在值时,其相应的容器也为空?

谢谢。

1 个答案:

答案 0 :(得分:0)

我的主要问题是,您正在使用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 ++版本。