diff --git a/lib/utils/mu-utils.cc b/lib/utils/mu-utils.cc index 8f5dbae2..bf24bd4a 100644 --- a/lib/utils/mu-utils.cc +++ b/lib/utils/mu-utils.cc @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -142,8 +143,6 @@ Mu::utf8_flatten(const char* str) } - - /* turn \0-terminated buf into ascii (which is a utf8 subset); convert * any non-ascii into '.' */ @@ -162,7 +161,6 @@ asciify_in_place (char *buf) return buf; } - static char* utf8ify (const char *buf) { @@ -245,7 +243,6 @@ Mu::split(const std::string& str, const std::string& sepa) std::vector Mu::split(const std::string& str, char sepa) { - std::vector vec; size_t b = 0, e = 0; @@ -266,6 +263,14 @@ Mu::split(const std::string& str, char sepa) return vec; } +std::vector +Mu::split(const std::string& str, const std::regex& sepa_rx) +{ + std::sregex_token_iterator it(str.begin(), str.end(), sepa_rx, -1); + std::sregex_token_iterator end; + + return {it, end}; +} std::string Mu::join(const std::vector& svec, const std::string& sepa) diff --git a/lib/utils/mu-utils.hh b/lib/utils/mu-utils.hh index 1842c7d2..bfe14905 100644 --- a/lib/utils/mu-utils.hh +++ b/lib/utils/mu-utils.hh @@ -33,6 +33,7 @@ #include #include #include +#include #include "mu-utils-format.hh" #include "mu-option.hh" @@ -85,7 +86,6 @@ std::string remove_ctrl(const std::string& str); */ std::vector split(const std::string& str, const std::string& sepa); - /** * Split a string in parts. As a special case, splitting an empty string * yields an empty vector (not a vector with a single empty element) @@ -97,6 +97,15 @@ std::vector split(const std::string& str, const std::string& sepa); */ std::vector split(const std::string& str, char sepa); +/** + * Split a string in parts + * + * @param str a string + * @param sepa the separator regex + * + * @return the parts. + */ +std::vector split(const std::string& str, const std::regex& sepa_rx); /** * Join the strings in svec into a string, separated by sepa diff --git a/lib/utils/tests/test-utils.cc b/lib/utils/tests/test-utils.cc index 0c54acba..62399450 100644 --- a/lib/utils/tests/test-utils.cc +++ b/lib/utils/tests/test-utils.cc @@ -208,7 +208,7 @@ test_split() g_assert_cmpstr(sv1[i].c_str(),==,sv2[i].c_str()); }; - + // string sepa assert_equal_svec(split("axbxc", "x"), {"a", "b", "c"}); assert_equal_svec(split("axbxcx", "x"), {"a", "b", "c", ""}); assert_equal_svec(split("", "boo"), {}); @@ -216,10 +216,12 @@ test_split() assert_equal_svec(split("abc", ""), {"a", "b", "c"}); assert_equal_svec(split("", "boo"), {}); - + // char sepa assert_equal_svec(split("axbxc", 'x'), {"a", "b", "c"}); assert_equal_svec(split("axbxcx", 'x'), {"a", "b", "c", ""}); - assert_equal_svec(split("", "boo"), {}); + + // rx sexp + assert_equal_svec(split("axbyc", std::regex("[xy]")), {"a", "b", "c"}); } static void