【问题标题】:Parse string where "separator" can be part of data?解析字符串,其中“分隔符”可以是数据的一部分?
【发布时间】:2012-04-18 19:51:20
【问题描述】:

我有这样的标准字符串:

用户名:消息

乍一看,这似乎是一个简单的问题,但问题在于名称的最后一个字符可能是“:”,而字符串中消息部分的第一个字母也可能是“:”。用户的名字中也可以有空格。

所以一个用户可能是名字'some name:' 并且可能会输入一条消息“:你好”

看起来像: '一些名字: : : 你好'

我确实有用户名列表(向量)。

鉴于此,有没有办法从这种字符串中提取用户名? (理想情况下无需遍历用户列表)

谢谢

【问题讨论】:

  • 您至少可以通过检查是否只有1个':',将问题分解为简单情况和复杂情况。
  • 消息是如何分开的??用':'?
  • 带有':' 示例:你:认为
  • 邮件可以包含:吗? (我用它可能的假设更新了标题。如果我搞砸了,请纠正。)
  • 你为什么要把两者结合起来?有什么方法可以让他们一直分开吗?你能在这个字符串的开头添加一些长度值(包含用户名的长度)吗?

标签: c++ string parsing std


【解决方案1】:

试试regex,比如(\w+?):\ \w+

【讨论】:

  • 这个问题根本上是模棱两可的。给定“name: : Hello”,无法确定额外的冒号是来自名称的末尾还是消息的开头。正则表达式将根据实现的贪婪程度选择其中一个。
  • 嗯……大多数正则表达式实现都非常确定。贪婪者抓住最后机会,不贪婪者首先。
【解决方案2】:

如果您不能保证用户名不包含“:”字符,并且您想避免每次检查都遍历整个列表,您可以尝试使用快捷方式。

只保留包含特殊字符的用户名的向量(我想这是所有用户名的一小部分)。首先检查这些,如果找到匹配项,请获取 [username]: 之后的字符串。否则,您可以简单地对冒号进行简单的拆分。

【讨论】:

    【解决方案3】:

    我会使用字符串标记

    string text = "token, test   string";
    
    char_separator<char> sep(":");
    tokenizer< char_separator<char> > tokens(text, sep);
    BOOST_FOREACH(string t, tokens)
    {
        cout << t << "." << endl;
    }
    

    【讨论】:

      【解决方案4】:

      我会解决这个问题的方法是简单地找到第一个冒号。拆分那里的字符串,然后修剪剩余的两个字符串。

      我并不完全清楚为什么会有额外的冒号以及它们是否是值的一部分。如果需要移除它们,那么您还需要将它们剥离。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 2011-01-20
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        相关资源
        最近更新 更多