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];
}
}
}
'?'を付けることで、最短一致か最長一致かを指定することができる。