我正在使用以下模式(?<=<)(?<!>).*?q.*?(?!<)(?=>)
,它使用正面和负面的lookahead和lookbehind来匹配括在匹配括号中的文字q
。
C ++ RegEx不支持lookbehind什么是一个好的选择?谢谢!
答案 0 :(得分:2)
请注意,(?<=<)(?<!>)
等于(?<=<)
(因为当前位置的左侧需要<
,因此不能有>
}和{{ 1}}等于(?!<)(?=>)
(这里适用相同的逻辑,因为(?=>)
必须立即在右边,不会有任何>
)。第一个<
将不匹配可能的最短子字符串,它将逐字地找到第一个.*?
的路径,其后跟着任何0 +字符到第一个q
。因此,即使在支持后视的引擎中,这种模式也难以为你服务。
我宁愿将>
正则表达式与捕获组一起使用,并且在表达式的开头/结尾使用<([^<>q]*q[^<>]*)>
和<
字符:
>
请参阅C++ demo
输出: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;
}
和abq