使用 C++ RegEx 进行后视的替代方法是什么?

Joe*_*oey 11 regex string c++11 regex-lookarounds

我正在使用以下模式:

(?<=<)(?<!>).*?q.*?(?!<)(?=>)
Run Code Online (Sandbox Code Playgroud)

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

std::regex不支持后视。那么什么是好的选择呢?

Wik*_*żew 5

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

我宁愿在表达式的开头/结尾使用<([^<>q]*q[^<>]*)>带有捕获组 和文字消耗<和符号的正则表达式:>

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;
}
Run Code Online (Sandbox Code Playgroud)

查看C++ 演示

输出:abqqaz