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)

文字列が有効な形式であるかどうかを簡単に確認する方法はカレーです。

4

1 に答える 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
-----------
于 2013-11-07T08:58:14.780 に答える