gpt4 book ai didi

c# - 为什么使用 Regex.IsMatch 检查此字符串会导致 CPU 达到 100%?

转载 作者:可可西里 更新时间:2023-11-01 03:09:03 25 4
gpt4 key购买 nike

在特定字符串上使用 Regex.IsMatch(C#、.Net 4.5)时,CPU 达到 100%。

字符串:

https://www.facebook.com/CashKingPirates/photos/a.197028616990372.62904.196982426994991/1186500984709792/?type=1&permPage=1

图案:

^http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?$

完整代码:

Regex.IsMatch("https://www.facebook.com/CashKingPirates/photos/a.197028616990372.62904.196982426994991/1186500984709792/?type=1&permPage=1",
@"^http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?$");

我发现编辑 URL 可以防止这个问题。编辑后的网址:

https://www.facebook.com/CashKingPirates/photos/a.197028616990372.62904.196982426994991/1186500984709792

但仍然非常有兴趣了解导致这种情况的原因。

最佳答案

正如 nu11p01n73R 所指出的,您的正则表达式有很多回溯。这是因为您的表达式的各个部分都可以匹配同一事物,这为引擎提供了很多选择,它必须在找到结果之前尝试。

您可以通过更改正则表达式使各个部分更加具体来避免这种情况。在您的情况下,原因是您想要匹配一个真实的点,但使用了全匹配字符 . 。您应该将其转义为 \.

这应该已经大大减少了回溯需求并使其变得更快:

^http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=])?$

而如果要真正匹配原字符串,还需要在字符类的末尾加上一个量词:

^http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]+)?$

关于c# - 为什么使用 Regex.IsMatch 检查此字符串会导致 CPU 达到 100%?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31227785/

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