c++ - 解析 C++ 字符串

标签 c++ string parsing c++11

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

我正在使用 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/

相关文章:

ruby - 如何在 Nokogiri/Ruby 解析期间检查页面上是否存在元素?

c++ - 在 Qt C++ 中的自定义项委托(delegate)上绘制文本时的性能问题

c++ - C++平台上的ADO可以用来查询一定范围的记录吗?例如。每个查询 100 条记录?

c++ - 如何使用相同的成员函数更改相同的不同元素?

c# - 通过 POST 解析

perl - 如何在 Perl WWW::Mechanize 中处理一个简单的循环?

c++ - 如果构造函数在私有(private)部分,为什么我们不能创建对象?

c++ - Visual Studio C++ 2013 调试器不稳定的步骤行为

c# - 循环逗号分隔的字符串,分成多个数组?

java - 替换 byte[] 中的字符串