std::regexのメモ (その1)

C++正規表現を扱う。数字と助数詞を取り出す疑似コード。
input: リンゴ2個とイチゴ3個を買う。
re: std::regex re( R"( (\D*?[^+-]*?)([+-]?\d[\d,]*[\.]?\d*)(個|匹|本)(.*?) )");

 

std::vector<std::string> match(std::string& text, std::regex const& re) {

     std::vector<std::string> result;

     std::smatch m;

 

     std::regex_match(text, m, re);

     for (auto &&elem: m) {

          result.push_back(elem.str());

     }

     return result;

}

 

std::string apply_re(std::string input, std::regex re) {
     while (true) {
          auto result = match(input, re);

          if (result.size() == 0) {
               break;
          } else {
               // result[1]: prefix
               // result[2]: 数字
               // result[3]: 助数詞
               // result[4]: suffix
               input = result[4];
          }
     }
}

'?'を付けることで、最短一致か最長一致かを指定することができる。