我有一个需要解析的数据列表。 数据如下:
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'数组。 有没有一种方法可以正确处理此问题,以便在不存在值时,其相应的容器也为空?
谢谢。
答案 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 ++版本。