对于效果原因,如何强制Regex在找到第一个匹配后立即停止处理整个文本 ?
我尝试了'非贪婪重复'和'有界重复',甚至还匹配换行符(\ n) ,然后处理整个文本集并进行多个匹配!
以下示例说明了这一点:
我试过的正则表达式:
Cookie: (.*)[\n]
Cookie: (.*){1}
Cookie: (.*)?
文本:
Accept-Language: en-US,en;q=0.9
Cookie: user=jdoe; fname=John; lname=Doe
CPU wasted processing this arbitrary text...
Cookie: ja_dravity_tpl=ja_dravity; utmz=22
Still wasting CPU on the entire string of text...
Cookie: user=msmith; fname=Mary; lname=Smith
不幸的是,所有三个'Cookie:'行匹配,这显然意味着整个文本字符串已被处理。
在这里,我们可以看到实际发生的事情:https://regexr.com/3iabj
更新 非常感谢gribvirus74指出我正确的方向,这就是它在C ++中的表现:
std::regex expression("Cookie: (.*)");
std::smatch results;
bool found = std::regex_search(str, results, expression);
if (found) {
std::cout << results[0].str() << std::endl; // entire matched string or
std::cout << results[1].str() << std::endl; // only the first submatch
}
else
std::cout << "Not found." << std::endl;
答案 0 :(得分:1)
要在第一次正确匹配后停止处理并删除“g 标志”(这不是在 C++ 中使用 std::regex
的选项),您必须添加标志“{{1 }}',如下例所示:
std::regex_constants::nosubs
如果您想进一步提高性能,可以在表达式声明中添加标志 std::regex expression("Cookie: (.*)", std::regex_constants::nosubs);
std::smatch results;
bool found = std::regex_search(str, results, expression);
if (found) {
std::cout << results.size() << std::endl; // returns always 1
}
else
std::cout << "Not found." << std::endl;
:
std::regex_constants::optimize
答案 1 :(得分:0)
只需从正则表达式中删除 g 标志即可。它将禁用迭代搜索。