问题描述
POSIX standard指出ERE和BRE均如此:
与整个匹配是最左边的匹配中最长的匹配一致,每个子模式从左到右都应匹配可能的最长字符串。为此目的,空字符串应被认为比根本没有匹配要长。例如,将BRE“(.. )。”与“ abcdef”匹配,子表达式“(\ 1)”是“ abcdef”,而BRE“(a *)*”与“ bc”,子表达式“(\ 1)”为空字符串。
我的问题:(a|ab)(c|bcd)(d*)
与“ abcd”应该如何匹配?
我对上述标准的理解是,子表达式(a|ab)
应该与最左边的最长字符串匹配,以使整个匹配尽可能长,因此子表达式应该与“ ab”匹配。但是,当我使用GNU正则表达式在“ abcd”中搜索(a|ab)(c|bcd)(d*)
时,对于第一个子表达式,我得到以下信息:
echo abcd | sed -E 's/(a|ab)(c|bcd)(d*)/\0,\1,\2,\3/'
abcd,a,bcd,
此示例来自this page。
这是使用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,
这里,与标准一致,子表达式(a|ab)
与它可以匹配的最长对象匹配,但是在GNU regex中却没有。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)