#include <algorithm>
#include <iostream>
#include <regex>
#include <string>
#include <utility>
#include <vector>
std::regex operator ""_re (char const * const str, std::size_t)
{
return std::regex { str };
}
class split
{
public:
split(std::regex splitter, std::string original)
: splitter_ { std::move(splitter) }
, original_ { std::move(original) }
{
}
auto begin() const
{
return std::sregex_token_iterator { original_.begin(), original_.end(), splitter_, -1 };
}
auto end() const
{
return std::sregex_token_iterator {};
}
template <typename Container>
operator Container () const
{
return { begin(), end() };
}
private:
std::regex splitter_;
std::string original_;
};
int main()
{
using namespace std::literals::string_literals;
std::vector<std::string> const words = split {
R"(\s+)"_re,
"hello\tdarkness my\nold friend"s
};
for (auto const & word : words)
std::cout << word << "\n";
for (auto const & number : split { ","_re, "23,42,1337" })
std::cout << number << "\n";
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmVnZXg+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8dmVjdG9yPgoKc3RkOjpyZWdleCBvcGVyYXRvciAiIl9yZSAoY2hhciBjb25zdCAqIGNvbnN0IHN0ciwgc3RkOjpzaXplX3QpCnsKCXJldHVybiBzdGQ6OnJlZ2V4IHsgc3RyIH07Cn0KCmNsYXNzIHNwbGl0CnsKcHVibGljOgoJc3BsaXQoc3RkOjpyZWdleCBzcGxpdHRlciwgc3RkOjpzdHJpbmcgb3JpZ2luYWwpCgkJOiBzcGxpdHRlcl8geyBzdGQ6Om1vdmUoc3BsaXR0ZXIpIH0KCQksIG9yaWdpbmFsXyB7IHN0ZDo6bW92ZShvcmlnaW5hbCkgfQoJewoJfQoJCglhdXRvIGJlZ2luKCkgY29uc3QKCXsKCQlyZXR1cm4gc3RkOjpzcmVnZXhfdG9rZW5faXRlcmF0b3IgeyBvcmlnaW5hbF8uYmVnaW4oKSwgb3JpZ2luYWxfLmVuZCgpLCBzcGxpdHRlcl8sIC0xIH07Cgl9CgkKCWF1dG8gZW5kKCkgY29uc3QKCXsKCQlyZXR1cm4gc3RkOjpzcmVnZXhfdG9rZW5faXRlcmF0b3Ige307Cgl9CgkKCXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CglvcGVyYXRvciBDb250YWluZXIgKCkgY29uc3QKCXsKCQlyZXR1cm4geyBiZWdpbigpLCBlbmQoKSB9OwoJfQoKcHJpdmF0ZToKCXN0ZDo6cmVnZXggc3BsaXR0ZXJfOwoJc3RkOjpzdHJpbmcgb3JpZ2luYWxfOwp9OwoKaW50IG1haW4oKQp7Cgl1c2luZyBuYW1lc3BhY2Ugc3RkOjpsaXRlcmFsczo6c3RyaW5nX2xpdGVyYWxzOwoJCglzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3Qgd29yZHMgPSBzcGxpdCB7CgkJUiIoXHMrKSJfcmUsCgkJImhlbGxvXHRkYXJrbmVzcyAgICAgbXlcbm9sZCBmcmllbmQicwoJfTsKCQoJZm9yIChhdXRvIGNvbnN0ICYgd29yZCA6IHdvcmRzKQoJCXN0ZDo6Y291dCA8PCB3b3JkIDw8ICJcbiI7CgkJCglmb3IgKGF1dG8gY29uc3QgJiBudW1iZXIgOiBzcGxpdCB7ICIsIl9yZSwgIjIzLDQyLDEzMzciIH0pCgkJc3RkOjpjb3V0IDw8IG51bWJlciA8PCAiXG4iOwoJCQoJcmV0dXJuIDA7Cn0K