使用 C++ RegEx 的 lookbehind 的替代方案是什么?

What is an alternative for lookbehind with C++ RegEx?

我正在使用以下模式:

(?<=<)(?<!>).*?q.*?(?!<)(?=>)

它使用正面和负面的前瞻和后视来匹配包含在匹配括号中的文字 q

std::regex 不支持回顾。那么什么是好的选择?

请注意 (?<=<)(?<!>) 等于 (?<=<)(因为 < 需要紧靠当前位置的左侧,所以不能有任何 >)和(?!<)(?=>) 等于 (?=>)(同样的逻辑适用于此,因为 > 必须紧靠右边,不会有任何 <)。第一个 .*? 不会匹配可能的最短子字符串,它会从字面上找到第一个 q 的方式,然后是任何 0+ 个字符,直到第一个 >。因此,即使在支持后视的引擎中,该模式也很难为您工作。

我宁愿将 <([^<>q]*q[^<>]*)> 正则表达式与 捕获组 和文字消耗 <> 符号一起使用 [=38] =] 的表达式:

std::regex r("<([^<>q]*q[^<>]*)>");
std::string s = "<adqsdq<><abc>5<abq>6<qaz> <hjfffffffk>";
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
                         i != std::sregex_iterator();
                         ++i)
{
    std::cout << (*i).str(1)  << srd::endl;
}

C++ demo

输出:abqqaz