gpt4 book ai didi

c++ - 正则表达式捕获使代码崩溃

转载 作者:行者123 更新时间:2023-11-30 03:25:48 25 4
gpt4 key购买 nike

我试图弄清楚 C++ 中的正则表达式是如何工作的,所以我做了这个例子,我尝试了不同的正则表达式,看看它们是否匹配:

#include <regex>

int main(){

while (true) {
string needle;
cin >> needle;
regex regexp(needle);
std::smatch smatch;
string haystack = "caps.caps[0].MainFormat[0].Video.BitRateOptions = 896, 1536";

bool match = regex_search(haystack, smatch, regexp);

if (match) {
cout << "Matched" << endl;
}
else {
cout << "Mismatch" << endl;
}
}
}

结果如下:

caps.caps[0].MainFormat[0].Video.BitRateOptions
Mismatch
(caps.caps[0].MainFormat[0].Video.BitRateOptions)
Mismatch
caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions
Matched
(caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions)
Matched
caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions=
Mismatch
(caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions=)
Mismatch
caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions =
Matched
Matched
(caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions =)
THIS ONE BREAK THE PROCESS AND ENDS
caps.caps\[0]
THIS ONE BREAK THE PROCESS AND ENDS

为什么 caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions = 返回两个匹配项,为什么捕获此正则表达式会使代码崩溃?基于此,我假设当我想匹配 '[' 或 ']' 时,我需要将其转义,并且可能在其他一些情况下,错误构造的 regexp 可能会导致进程崩溃。是否有任何选项可以处理未转义的“[”或“]”和其他错误的正则表达式,因此代码不会崩溃而是不匹配?我在 Windows 10 上使用 Visual Studio 2017。谢谢

最佳答案

第一个

caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions =

返回两个匹配项,因为 std::cin >> needle;只读取直到找到第一个空白字符(第一个匹配项)。然后它读取下一个“单词”=,这给出了第二个匹配项。


类似的行为发生在下一个

(caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions =)

读取第一部分 (... 不包括第一个空格。现在正则表达式不完整并抛出异常。使用 g++ 这看起来像

terminate called after throwing an instance of 'std::regex_error'
what(): regex_error


如果您想要完整的行,请使用 std::getline相反

while (std::getline(std::cin, needle)) {
// ...
}

我无法用最后一个重现任何中止

caps.caps\[0]

这会按预期返回匹配项。

关于c++ - 正则表达式捕获使代码崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48782530/

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