2015-09-06 4 views
-1

Учитывая код:Разбивает строку и получить значения перед различными разделителями

procedure example { 
    x=3; 
    y = z +c ; 
    while p { 
    b = a+c ; 
    } 
} 

Я хотел бы разделить код, используя разделители {, ; и }. После расщепления я хотел бы получить информацию перед ней вместе с разделителем.

Так, например, я хотел бы получить procedure example {, x=3;, y=z+c;, }. Тогда я хотел бы нажать его в list<pair<int, string>> sList. Может ли кто-нибудь объяснить, как это можно сделать в C++?

Я пробовал следовать этому примеру: Parse (split) a string in C++ using string delimiter (standard C++), но я мог получить только один токен. Я хочу всю линию. Я новичок в C++, а список, расщепление и т. Д. Запутан.

Edit: Так я реализовал его, и это код:

size_t openCurlyBracket = lines.find("{"); 
size_t closeCurlyBracket = lines.find("}"); 
size_t semiColon = lines.find(";"); 

if (semiColon != string::npos) { 
    cout << lines.substr(0, semiColon + 1) + "\n"; 
} 

Тем не менее, кажется, что он не может с отдельной точкой с запятой на основе отдельно, openBracket и closeBracket. Кто-нибудь знает, как индивидуально отделяться от этих символов?

2nd Редактировать: Я сделал это (коды ниже). Он правильно отделяется, у меня есть один для открытой фигурной скобки. Я планировал добавить значение в список в комментариях ниже. Однако, когда я думаю об этом, если я это сделаю, тогда порядок информации в списке будет испорчен. Поскольку у меня есть другой цикл while, который отделяется на основе открытой фигурной скобки. Любая идея о том, как я могу добавить информацию в заказ?

Example: 
1. procedure example { 
2. x=3; 
3. y = z+c 
4. while p{ 

и так далее.

while (semiColon != string::npos) { 
     semiColon++; 
     //add list here 
     semiColon = lines.find(';',semiColon); 
    } 
+0

В вашем примере на то, что вы хотели бы получить, отсутствует цикл while. Это намеренно? Если да, каковы ваши точные критерии для анализа кода? – honk

+0

@honk Извините, если я не понял. Это был всего лишь пример того, что я хочу. а также включен. Я успешно отделил их сейчас, сейчас я пытаюсь поместить его в список. – user3453250

+0

Пользователь @ user3188346 предложил использовать функцию 'find_first_of' в своем ответе. Это должно помочь вам сохранить порядок линий. Вы попробовали это? – honk

ответ

0

Я думаю, что вы должны прочитать о std::string::find_first_of function.

Searches the string for the first character that matches any of the characters specified in its arguments. 

У меня есть проблема, чтобы понять, чего вы действительно хотите достичь. Скажем, это пример использования функции find_first_of.

list<string> split(string lines) 
{ 
    list<string> result; 
    size_t position = 0; 

    while((position = lines.find_first_of("{};\n")) != string::npos) 
    { 
     if(lines[position] != '\n') 
     { 
      result.push_back(lines.substr(0, position+1)); 
     } 
     lines = lines.substr(position+1); 
    } 

    return result; 
} 
Смежные вопросы