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 天 迭代器生成器装饰器正则表达式

使用正则表达式生成字符串而不是匹配它们

手机号码正则表达式