Joe*_*oey 11 regex string c++11 regex-lookarounds
我正在使用以下模式:
(?<=<)(?<!>).*?q.*?(?!<)(?=>)
Run Code Online (Sandbox Code Playgroud)
它使用正面和负面的前瞻和后视来匹配q包含在匹配括号中的文字。
std::regex不支持后视。那么什么是好的选择呢?
请注意,(?<=<)(?<!>)等于(?<=<)(因为 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++ 演示
输出:abq和qaz
| 归档时间: |
|
| 查看次数: |
5258 次 |
| 最近记录: |