gpt4 book ai didi

c++ - vc++ std::regex_match 返回一个带有交替正则表达式的额外空字符串

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:18 26 4
gpt4 key购买 nike

为什么这个正则表达式返回空字符串与 std::regex_match 的额外匹配?

std::regex trim_comments_spaces("^\\s*(?:(?:(.*?)\\s*[/]{2,}.*)|(?:(.*?)\\s*))$");

它似乎给出了正确的匹配,但我必须访问 std::smatch 结果的第三个元素。,这让我怀疑我的更改/分组/捕获语法有点错误。

std::string trim_line(std::string current_line) {

std::string trimmed_line = "";

if (current_line != "#include <glsl.h>") {

std::regex trim_comments_spaces("^\\s*(?:(?:(.*?)\\s*[/]{2,}.*)|(?:(.*?)\\s*))$");
std::smatch sub_matches;

if (std::regex_match(current_line, sub_matches, trim_comments_spaces)) {
std::cout << sub_matches.size() << "\n";
std::string sub_string = sub_matches[2].str();

if (sub_string != "") {
std::regex validate_line("^(?:(?:[a-z][a-zA-Z0-9\\s_+*\\-/=><&|^?:{().,[\\]]*[;{})])|[}])$");

if (std::regex_match(sub_string.begin(), sub_string.end(), validate_line)) {
trimmed_line = sub_string;
}
else {
std::cout << "Syntax error(2): " << sub_string << "\n";
}
}
}
else {
std::cout << "Syntax error(1): " << current_line << "\n";
}
}

return trimmed_line;
}

最佳答案

您的正则表达式一旦针对匹配的字符串执行,将为您获取一个具有 3 组的 smatch 对象:

  • 1) 第 0 组 - 整场比赛,
  • 2) 第 1 组 - (.*?)^\\s*(?:(?:(.*?)\\s*[/]{2, }.*)|
  • 3) 第二组 - (?:(.*?)\\s*))$
  • 中的 (.*?)

无论组是否匹配,如果你在模式中定义了一个(...),它将首先用一个空字符串初始化,然后,它要么被捕获的填充值,否则它将保持为空。当然,除非您使用同名组或分支重置,但您无法在 std::regex 中访问它们。您可以使用 Boost 并使用 "^\\s*(?|(?:(.*?)\\s*[/]{2,}.*)|(? :(.*?)\\s*))$"(请参阅 (?| 构造,然后您需要的所有值都将在第 1 组中)

如果您使用当前代码,您可以连接第 1 组和第 2 组,因为其中一个组始终为空。

std::string sub_string = sub_matches[1].str() + sub_matches[2].str();

参见 C++ demo

关于c++ - vc++ std::regex_match 返回一个带有交替正则表达式的额外空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38657902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com