Как я могу получить все возможные совпадения регулярного выражения
Например:
((a,b,c)o(m,v)p,b)
Строки, сгенерированные из приведенного выше выражения, будут такими:
аомп
бомба
комп
аовп
бовп
ковп
b
Как я могу получить все возможные совпадения регулярного выражения
Например:
((a,b,c)o(m,v)p,b)
Строки, сгенерированные из приведенного выше выражения, будут такими:
аомп
бомба
комп
аовп
бовп
ковп
b
Ваши шаги довольно просты, хотя их реализация может потребовать некоторой работы:
','
на vector<string>
и верните их: https://stackoverflow.com/a/28880605/2642059 а>ИЗМЕНИТЬ:
Скажем, моя входная строка была "(bl(ah,eck,le),yap)"
string
: "bl(ah,eck,le),yap"string
: "ah,eck,le"vector<string>
: ["ah", "eck", "le"]Возврат из вашей первой функции - это ваш результат.
ИЗМЕНИТЬ:
Рад, что вы решили эту проблему, я написал автомат с двумя состояниями, чтобы решить эту проблему, поэтому я решил опубликовать его здесь для вашего сравнения:
const char* extractParenthesis(const char* start, const char* finish){
int count = 0;
return find_if(start, finish, [&](char i){
if (i == '('){
count++;
}
else if (i == ')'){
count--;
}
return count <= 0; });
}
vector<string> split(const char* start, const char* finish){
const char delimiters[] = ",(";
const char* it;
vector<string> result;
do{
for (it = find_first_of(start, finish, begin(delimiters), end(delimiters));
it != finish && *it == '(';
it = find_first_of(extractParenthesis(it, finish) + 1, finish, begin(delimiters), end(delimiters)));
auto&& temp = interpolate(start, it);
result.insert(result.end(), temp.begin(), temp.end());
start = ++it;
} while (it <= finish);
return result;
}
vector<string> interpolate(const char* start, const char* finish){
vector<string> result{ 1, string{ start, find(start, finish, '(') } };
for (auto it = start + result[0].size();
it != finish;
it = find(++start, finish, '('),
for_each(result.begin(), result.end(), [&](string& i){ i += string{ start, it }; })){
start = extractParenthesis(it, finish);
auto temp = split(next(it), start);
const auto size = result.size();
result.resize(size * temp.size());
for (int i = result.size() - 1; i >= 0; --i){
result[i] = result[i % size] + temp[i / size];
}
}
return result;
}
В зависимости от вашего компилятора вам нужно будет объявить их, так как они вызывают друг друга. Это также приведет к фантастическому сбою, если входная строка искажена. И он не может обрабатывать экранированные управляющие символы.
В любом случае вы можете назвать это так:
const char test[] = "((a,b,c)o(m,v)p,b)";
auto foo = interpolate(begin(test), end(test));
for (auto& i : foo){
cout << i << endl;
}
a+
. - person Sebastian Redl   schedule 05.03.2015