Это может быть относительно легко сделать с регулярными выражениями: std::regex
, если у вас есть C++ 11; boost::regex
если вы этого не сделаете:
static std::regex(R"(.*\\(\w+)\s*-\s*(\w+)\\[^\\]*$");
smatch results;
if (std::regex_match(path, results, regex)) {
std::string firstMatch = results[1];
std::string secondMatch = results[2];
// ...
}
Кроме того, вы определенно должны иметь функции split
и trim
в инструментарии:
template <std::ctype_base::mask test>
class IsNot
{
std::locale ensureLifetime;
std::ctype<char> const* ctype; // Pointer to allow assignment
public:
Is(std::locale const& loc = std::locale())
: ensureLifetime(loc)
, ctype(&std::use_facet<std::ctype<char>>(loc))
{
}
bool operator()(char ch) const
{
return !ctype->is(test, ch);
}
};
typedef IsNot<std::ctype_base::space> IsNotSpace;
std::vector<std::string>
split(std::string const& original, char separator)
{
std::vector<std::string> results;
std::string::const_iterator current = original.begin();
std::string::const_iterator end = original.end();
std::string::const_iterator next = std::find(current, end, separator);
while (next != end) {
results.push_back(std::string(current, next));
current = next + 1;
next = std::find(current, end, separator);
}
results.push_back(std::string(current, next));
return results;
}
std::string
trim(std::string const& original)
{
std::string::const_iterator end
= std::find_if(original.rbegin(), original.rend(), IsNotSpace()).base();
std::string::const_iterator begin
= std::find_if(original.begin(), end, IsNotSpace());
return std::string(begin, end);
}
(Это только те, которые вы должны здесь вы явно. хочу полный набор предикатов IsXxx и IsNotXxx, раскол , который может разделяться в соответствии с регулярным выражением, обрезка которой может быть передана предикату, определяющая, что должно быть trimm ed и т. д.)
В любом случае, применение split
и trim
должно быть очевидно , чтобы предоставить вам то, что вы хотите.
Это может быть хороший случай для использования обычные выражения... – nabulke