使用Boost.Regex复制“ sed -E”输出的错误 问题1:问题2:

问题描述

我正在尝试使用Boost.Regex复制“ sed -E”的输出(因此,简单地更改正则表达式是不可行的。)

当我使用“ sed -E”在“ abcd”中搜索(a|ab)(c|bcd)(d*)时,将得到以下子表达式:

echo abcd | sed -E 's/(a|ab)(c|bcd)(d*)/\0,\1,\2,\3/'
abcd,a,bcd,

但是,这是一个使用Boost.Regex和regex :: extended标志的C ++代码:

#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
  boost::regex_constants::syntax_option_type regex_flags =
      boost::regex::extended;

  std::string text = "abcd";
  boost::regex expression("(a|ab)(c|bcd)(d*)",regex_flags);
  boost::smatch matches {};

  boost::regex_search(text,matches,expression);

  for (const auto match : matches) { std::cout << match << ","; }
  std::cout << std::endl;

  return 0;
}

编译并运行,会产生:

abcd,ab,c,d,

问题1:

有没有办法使boost :: regex匹配“ sed -E”的输出?

另一个不一致的表达式是.*(.*)(.*)(.*)。使用“ sed -E”时,.*(.*)中的第一个子表达式为空,但在(.*)(.*)中,第一个子表达式为“ abcd”。使用Boost.Regex(在扩展模式下),这两个子表达式中的第一个子表达式都是“ abcd”。

Boost.Regex的FAQ上的第二个条目实际上明确提到了这一点,但是我希望有人找到了解决方法。

问题2:

我相信Boost与POSIX standard一致,该声明指出:

与整个匹配是最左边的匹配中最长的匹配一致,每个子模式从左到右都应匹配可能的最长字符串。为此目的,空字符串应被认为比根本没有匹配长。例如,将BRE“(.. )。”与“ abcdef”匹配,子表达式“(\ 1)”是“ abcdef”,而BRE“(a *)*”与“ bc”,子表达式“(\ 1)”为空字符串。

那么这是GNU regex中的错误吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)