正则表达式 - 首次匹配后立即停止处理

时间:2017-12-20 15:55:04

标签: regex

对于效果原因,如何强制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;

2 个答案:

答案 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 标志即可。它将禁用迭代搜索。