解析C++字符串

Zac*_*h P 0 c++ string parsing c++11

这里有很多关于发布字符串的帖子,但实际上似乎不符合我的目的.

我正在使用std::string和所有C++标准库,并且我有一个使用以下协议的文本文件:

TEXT1:TEXT2-TAB-TEXT3:TEXT4 TEXT5
Run Code Online (Sandbox Code Playgroud)

-TAB-\t.

我想把所有文本都写成字符串(也可以是一个数组).所有文件中的行都是这样写的,我尝试使用istringstream,但它没有的功能,例如:iss >> text1 >> ":" >> text2 >> "\t" >> text3 >> ":" >> text4 >> " " >> text5.

我是否真的需要使用find等基本功能进行解析?这只是一大堆工作(因为我有几个以不同格式编写的文件,我需要为所有这些编写一个通用函数),如果我别无选择,我会这样做.

所以......有没有办法用以下方法解析字符串,使用字符串之间的已知字符?它不是一个特定的分隔符,因为每行包含几个分隔符(一次是空格,然后是冒号等).我想使用C++标准库而不是任何外部库,如Boost.

编辑:C++ 11.

dsp*_*der 6

由于您使用的是C++ 11并且文本行遵循协议,因此用于模式匹配和信息提取的工具是regex库中的功能.

与您的协议匹配的模式可能看起来像这样......

\ w +:\ w + - \T-\w +:\ w +\S\W +

...使用默认的ECMAScript语法.还有其他几个.

接下来,使用原始字符串文字来初始化正则表达式对象...

正则表达式{R("\ w +:\ w + - \t-\w +:\ w +\s\w +")};

所以现在你的代码看起来像这样......

#include<regex>
...

regex pat{R("\w+:\w+-\t-\w+:\w+\s\w+")};
smatch m;

while (cin >> str) {  // where str is your line of formatted text
    bool match = regex_search(str, m, pat);
    for (int i = 0; i < m.size(); i++) {
        cout << m[i].str() << " "; // to make sure each component was matched
    }   
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,smatch就像一个容器,可以迭代,所以非常方便.

注意:上述代码不能保证有效,它被用作指南.