Parsing strings in C++ by multiple delimiters
我有一个字符串对象,类似于:
1 2 3 4 5 6 | string test =" [3, 4, 8, 10, 10] [12] [12, 10, 20] " |
我试图将它解析为3个独立的数组,分别等于[3,4,8,10,10],[12]和[12,10,20]。我以前已经将逗号分隔的整数解析成一个数组,但是如何解析这个数组呢?不幸的是,我所拥有的数据可以使用换行中间数组,否则我将使用"getline"函数(在将文件读取到字符串中时),并忽略括号。
似乎我需要先将每个数组放入用括号分隔的字符串中,然后用逗号分隔的方法将每个数组解析为一个整数数组。这行吗?
如果是这样,如何将字符串用括号拆分为以前未知的其他字符串数?
您可以使用streams和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | int main() { std::string test ="[3, 4, 8, 10, 10] [12] [12, 10, 20]"; // make data a stream (could be a std::ifstream) std::istringstream iss(test); // working vars std::string skip, item; // between square braces // skip to the opening '[' then getline item to the closing ']' while(std::getline(std::getline(iss, skip, '['), item, ']')) { // item ="3, 4, 8, 10, 10" // store numbers in a vector (not array) std::vector<int> v; // convert item to a stream std::istringstream iss(item); // separated by commas while(std::getline(iss, item, ',')) v.push_back(std::stoi(item)); // display the results std::cout <<"list:" << ' '; for(auto i: v) std::cout <<"\t" << i << ' '; } } |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 | list: 3 4 8 10 10 list: 12 list: 12 10 20 |
如果您已经将整个内容读取到一个字符串中,那么以下内容应该有效:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <iostream> #include <string> using namespace std; int main() { string test ="[3, 4, 8, 10, 10] [12] [12, 10, 20]"; size_t start = 0; // first position in the string // find the first occurance of"]" size_t pos = test.find("]"); while ( pos != string::npos ) { // move to position after"]" // so it is included in substring pos += 1; // create a substring string subStr = test.substr(start, pos-start); // remove newlines from new string size_t newLinePos = subStr.find(" "); while ( newLinePos != string::npos ) { subStr.erase(newLinePos,1); newLinePos = subStr.find(" "); } // here is the substring, like: [12, 10, 20] cout <<"Substring:" << subStr << endl; // update start position for next substring start = pos; // find next occurrance of"]" pos = test.find("]", pos); } } |
一种方法是使用explode()函数。explode()的实现将基于给定的分隔符将字符串拆分为多个字符串。这不是最有效的方法,但它可以使很多直观的意义。
见:是否有一个等价于C++的PHP的开发()函数?