如何导出正则表达式的所有可能匹配项
例如:
(((a,b,c)o(m,v)p,b)
从上面的表达式生成的字符串将是:
o 庞然大物 补偿 aovp bovp 冠状病毒 b
o
庞然大物
补偿
aovp
bovp
冠状病毒
b
尽管执行这些步骤可能需要一些工作,但您的步骤非常简单:
','
vector<string>
编辑:
说我的输入字符串是“(bl(ah,eck,le),yap)”
string
您第一个函数的回报就是您的结果。
很高兴您解决了这个问题,我也写了一个两状态机来解决它,所以我想可以将其发布在这里供您比较:
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; }