2012-04-18 43 views
1

我有性病串这样的:解析字符串“分隔符”可以成为数据的一部分吗?

用户名:消息

起初看起来这似乎是一个简单的问题,但这个问题是,这个名字的最后一个字符可能是一个“:”和第一个字母字符串的消息部分也可以是':'。用户也可以在他们的名字中有空格。

因此用户可能是名“一些名字:” ,可能键入一条消息“:你好”

将目光像: “一些名字:::你好”

我有用户名列表(矢量)虽然。

鉴于此,有没有一种方法可以从这种字符串中提取用户名? (理想情况下,无需通过用户列表进行迭代)

感谢

+0

你至少可以通过检查是否只有1个':'来将问题分解为简单情况和复杂情况。 – twain249 2012-04-18 19:55:47

+0

消息如何分离?与':'? – AlexTheo 2012-04-18 19:56:59

+0

使用':' 示例: 您:认为 – jmasterx 2012-04-18 19:57:51

回答

1

尝试regex(\w+?):\ \w+

+1

该问题根本上是不明确的。鉴于“name::Hello”,没有办法确定额外的冒号是来自名称末尾还是消息的开头。正则表达式将根据实现的贪婪程度来选择一个或另一个。 – 2012-04-18 20:20:31

+0

那么......大多数正则表达式的实现都相当确定。贪婪抓住最后的机会,不贪婪的第一次。 – nes1983 2012-04-18 21:29:08

1

如果您不能确定用户名不会包含“:”字符,并且您希望避免每次都检查整个列表,则可以尝试快捷方式。

保持只包含特殊字符的用户名的向量(我想象这是所有用户名的一小部分)。首先检查那些,如果你找到一个匹配,在[用户名]:后输入字符串。否则,你可以简单地对冒号做一个天真的分割。

0

我会用字符串标记

string text = "token, test string"; 

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

我会接近这个是简单地找到第一个冒号的方式。在那里拆分字符串,然后修剪剩下的两个字符串。

这并不完全清楚为什么有额外的冒号,如果他们是价值的一部分。如果他们需要被删除,那么你还需要删除它们。