c_cpp 正则表达式的数据生成器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 正则表达式的数据生成器相关的知识,希望对你有一定的参考价值。
#include <functional>
#include <iostream>
#include <string>
#include <vector>
const int repetition_limit = 10;
template<typename F>
void do_times(size_t count, const F &f)
{
while (count-- > 0)
f();
}
std::function<void ()> compile_impl(const char *&p, const std::function<int ()> &rng)
{
std::vector<std::vector<std::function<void ()>>> alternatives(1);
for (; *p && *p != ')'; p++)
{
if (*p == '(')
alternatives.back().push_back(compile_impl(++p, rng));
else if (*p == '|')
alternatives.emplace_back();
else if (*p == '+' || *p == '*' || *p == '?')
{
auto min = *p == '+' ? 1 : 0;
auto max = *p == '?' ? 2 : repetition_limit;
auto &gen = alternatives.back().back();
alternatives.back().back() = [=] { do_times(min + rng() % max, gen); };
}
else
{
auto ch = *p;
alternatives.back().emplace_back([=] { std::cout << ch; });
}
}
return [=] {
for (auto &gen : alternatives[alternatives.size() == 1 ? 0 : rng() % alternatives.size()])
gen();
};
}
std::function<void ()> compile(const char *p, const std::function<int ()> &rng)
{
return compile_impl(p, rng);
}
std::function<int ()> make_counter()
{
auto counter = 0U;
return [=]() mutable { return counter++; };
}
int main()
{
std::string regex;
std::getline(std::cin, regex);
//const auto &gen = compile(regex.c_str(), rand); // if you prefer
const auto &gen = compile(regex.c_str(), make_counter());
for (auto i = 0; i < 10; i++)
{
gen();
std::cout << std::endl;
}
}
以上是关于c_cpp 正则表达式的数据生成器的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp CPP - 教程019 - C ++正则表达式
c_cpp c ++中的简单匹配字符串与正则表达式只支持“*”和“?”通配符
hive正则表达式
第 4 天 迭代器生成器装饰器正则表达式
使用正则表达式生成字符串而不是匹配它们
手机号码正则表达式