关于数组:用多个分隔符在C ++中解析字符串

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和std::getline(),因为std::getline()将分隔符作为参数:

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的开发()函数?