这里有很多关于发布字符串的帖子,但似乎不符合我的目的。
我正在使用 std::string
和所有 C++ 标准库,并且我有一个使用以下协议(protocol)的文本文件:
TEXT1:TEXT2-TAB-TEXT3:TEXT4 TEXT5
当-TAB-
为\t
时。
我想将所有文本转换为字符串(也可以是数组)。文件中的所有行都是这样写的,我尝试使用 istringstream
但它没有任何功能,例如: iss >> text1 >> ":">> text2 >> "\t">> text3 >> ":">> text4 >> "">> text5
。
我真的需要使用 find
等基本功能进行解析吗?那只是大量的工作(因为我有几个以不同格式编写的文件,我需要为所有这些文件创建一个通用函数),但如果我别无选择,我会这样做。
那么...有没有办法通过以下方式使用字符串之间的已知字符来解析字符串?它不是一个特定的分隔符,因为每一行都包含几个分隔符(一次是空格,然后是一个冒号等等)。我想使用 C++ 标准库而不是任何外部库,例如 Boost。
编辑: C++11。
最佳答案
由于您使用的是 C++11 并且您的文本行遵守协议(protocol),因此用于模式匹配和信息提取的工具是正则表达式库中的功能。
匹配您的协议(protocol)的模式可能看起来像这样......
\w+:\w+-\t-\w+:\w+\s\w+
... 使用默认的 ECMAScript 语法。还有其他一些。
接下来,使用原始字符串文字来初始化正则表达式对象...
正则表达式 pat{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
}
}
顺便说一下,smatch 就像一个容器,可以迭代,所以非常方便。
注意:以上代码不能保证有效,仅供引用。
关于c++ - 解析 C++ 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28134746/