我正在使用 boost.xpressive 静态模板来构造动态连接成最终表达式的正则表达式。
动态版本具有可变宽度重复,但由于在 int 向量中操作,我确实需要使用静态构造。
我确实需要创建repeat<N,M>
whereN
并且M
不是常量。
怎么做?
我正在使用 boost.xpressive 静态模板来构造动态连接成最终表达式的正则表达式。
动态版本具有可变宽度重复,但由于在 int 向量中操作,我确实需要使用静态构造。
我确实需要创建repeat<N,M>
whereN
并且M
不是常量。
怎么做?
不幸的是,C++ 只允许您传递编译时已知的模板参数(参见此处),也就是常量表达式。
在这种情况下,这意味着输入的值repeat<N, M>
必须是文字或常量表达式,因此您不能只输入任何int
程序。
在没有看到任何代码的情况下很难给出更具体的建议,但似乎您正在尝试创建一个正则表达式,例如匹配n
某些组/文字的重复,其中n
在编译时尚不知道(即,取决于某些输入你的程序)。
这似乎是一个奇怪的用例,毕竟正则表达式通常是编译时常量(这就是 boost-xpressive 存在的原因)。
我建议改用动态(普通)正则表达式。无论如何,正则表达式都会被编译(预处理以加速正则表达式引擎的实现中的匹配)。
一般一个正则表达式生成一次,然后多次使用来匹配不同的字符串。因此,就性能而言,预处理步骤通常可以忽略不计。
编辑
根据您的要求,这是一个动态版本,包含在 a 中main
,它根据参数进行匹配:
#include <iostream>
#include <sstream>
#include <boost/xpressive/xpressive.hpp>
using namespace boost::xpressive;
int main(int argc, char* argv[])
{
smatch what;
int min_match = std::stoi(argv[1]);
int max_match = std::stoi(argv[2]);
std::ostringstream expr_buf;
expr_buf << "a{" << min_match
<< ","
<< max_match
<< "}"
<< "b";
sregex rex = sregex::compile(expr_buf.str());
std::string value = argv[3];
if(regex_match(value, what, rex))
{
std::cout << "There was a complete match" << std::endl;
}
else
{
std::cout << "There was no complete match" << std::endl;
}
return 0;
}
例如:
./main 1 3 "aaab" -> "There was a complete match"
./main 1 3 "cab" -> "There was no complete match"
./main 4 5 "aaab" -> "There was no complete match"