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.
由于您使用的是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就像一个容器,可以迭代,所以非常方便.
注意:上述代码不能保证有效,它被用作指南.
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |