2012-04-18 99 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

我會接近這個是簡單地找到第一個冒號的方式。在那裏拆分字符串,然後修剪剩下的兩個字符串。

這並不完全清楚爲什麼有額外的冒號,如果他們是價值的一部分。如果他們需要被刪除,那麼你還需要刪除它們。