1

我正在使用 boost.xpressive 静态模板来构造动态连接成最终表达式的正则表达式。

动态版本具有可变宽度重复,但由于在 int 向量中操作,我确实需要使用静态构造。

我确实需要创建repeat<N,M>whereN并且M不是常量。

怎么做?

4

1 回答 1

0

不幸的是,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"

于 2019-07-23T10:04:31.340 回答