2013-11-07 5 views
0

Как читать такие строки в C++, без использования регулярных выражений:Чтение строк без регулярного выражения?

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

Вы можете прочитать символы один за другим, и решить, если хорошо сформирован. – Narkha

+1

Постарайтесь подумать о том, что вы ожидаете получить дальше в любой точке входа, когда будете проходить через него. Вы должны иметь возможность проверить правильность такой строки за один проход. –

+0

Какова цель? эффективность для чего-то менее выразительного, чем регулярные выражения? нет регулярных выражений как упражнение? Помимо формы, мне сложно сопоставить свое описание с вашим примером. Особенно запятые путают –

ответ

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 
----------- 
Смежные вопросы