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

时间:2017-04-19 18:07:35

标签: regex string c++11 regex-lookarounds

我正在使用以下模式(?<=<)(?<!>).*?q.*?(?!<)(?=>),它使用正面和负面的lookahead和lookbehind来匹配括在匹配括号中的文字q。 C ++ RegEx不支持lookbehind什么是一个好的选择?谢谢!

1 个答案:

答案 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