2012-04-18 1 views
1

У меня есть StD строки как эти:Строка parse, где «разделитель» может быть частью данных?

UserName: Сообщение

На первый взгляд кажется, что простой проблемой, но этот вопрос в том, что последний символ в имени могло быть «:» и первую букву части сообщения строки может быть также::. Пользователь может также иметь пробелы в своем имени.

Таким образом, пользователь может быть имена «некоторые названия:» и может напечатать сообщение «: Hello»

Какой будет выглядеть так: «какой-то имя:: Hello»

У меня есть список (вектор) имен пользователей.

Учитывая это, есть ли способ, чтобы я мог извлечь имя пользователя из этой строки? (В идеале, без необходимости перебирать список пользователей)

Благодарности

+0

Вы можете как минимум разбить проблему на простой случай и сложный случай, проверив, есть ли только 1 '': ''. – twain249

+0

Как разделяются сообщения? с ':'? – AlexTheo

+0

С ':' Образец: Вы: думаете – jmasterx

ответ

1

Попробуйте regex как (\w+?):\ \w+.

+1

Проблема принципиально неоднозначна. Учитывая «name:: Hello», не существует способа решить, добавляется ли дополнительный двоеточие из конца имени или начала сообщения. Регулярное выражение будет выбирать одно или другое в зависимости от того, насколько жадным является реализация. –

+0

Ну ... большинство реализаций регулярных выражений довольно детерминированы. Жадный захватывает последний шанс, не жадный первый. – nes1983

1

Если вы не можете gaurentee, что имя пользователя не будет содержать символы «:», и вы хотите избежать повторного просмотра всего списка каждый раз, чтобы проверить, вы можете попробовать ярлык.

Сохраните вектор только имен пользователей, содержащих специальные символы (я представляю, что это небольшое подмножество всех имен пользователей). Сначала проверьте их, если вы найдете совпадение, возьмите строку после [имя_пользователя]:. В противном случае вы можете просто сделать наивный раскол на двоеточие.

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

так, как я бы подойти к этому, чтобы просто найти первое двоеточие. Разделите строку там, а затем обрезайте две оставшиеся строки.

Мне не совсем понятно, почему есть дополнительные двоеточия, и если они являются частью значения. Если их нужно удалить, вам также нужно будет их разбить.