Читать строки без регулярных выражений?

0

Как читать такие строки в C++, не используя regexp:

name(numeric_value_or_some_string[, numeric_value_or_some_string]) [name(numeric_value_or_some_string[, numeric_value_or_some_string])]

например:

 VM(4, 2) VR(7) VP(8, 3) I(VIN)

Я знаю, как легко проверить, соответствует ли строка правильной форме.

  • 0
    Вы можете прочитать символы один за другим и решить, хорошо ли они сформированы.
  • 1
    Постарайтесь продумать, что вы ожидаете получить дальше в любой точке ввода, когда будете проходить через него. Вы должны быть в состоянии проверить правильность такой строки за один проход.
Показать ещё 2 комментария
Теги:

1 ответ

2
Лучший ответ

Это просто простой синтаксический разбор, без магии:

#include <iostream>
#include <string>
#include <vector>

int main(int argc, char** argv){
  std::string str = "VM(4, 2) VR(7) VP(8, 3) I(VIN)";
  std::string name;
  size_t pos = 0;
  while(pos < str.size()){
    if(str.at(pos) == '('){
      ++pos;
      std::vector<std::string> values;
      std::string currentValue;
      while(pos < str.size()){
        if(str.at(pos) == ')'){
          if(!currentValue.empty()){
            values.push_back(currentValue);
            currentValue.clear();
          }
          break;
        }else if(str.at(pos) == ','){
          if(!currentValue.empty()){
            values.push_back(currentValue);
            currentValue.clear();
          }
        }else if(str.at(pos) == ' '){
          /* intentionally left blank */
          /* ignore whitespaces */
        }else{
          currentValue.push_back(str.at(pos));
        }
        pos++;
      }
      std::cout << "-----------" << std::endl;
      std::cout << "Name: " << name << std::endl;
      for(size_t i=0; i<values.size(); i++){
        std::cout << "Value "<< i <<": " << values.at(i) << std::endl;
      }
      std::cout << "-----------" << std::endl;
      name.clear();
    }else if(str.at(pos) == ' '){
          /* intentionally left blank */
          /* ignore whitespaces */
    }else{
      name.push_back(str.at(pos));
    }
    ++pos;
  }
  return 0;
}

Выход для вашего образца:

-----------
Name: VM
Value 0: 4
Value 1: 2
-----------
-----------
Name: VR
Value 0: 7
-----------
-----------
Name: VP
Value 0: 8
Value 1: 3
-----------
-----------
Name: I
Value 0: VIN
-----------

Ещё вопросы

Сообщество Overcoder
Наверх
Меню