c# - Regex.IsMatch 导致灾难性的回溯

标签 c# regex

我知道有很多类似的问题,但这是特定于我的正则表达式的。 我正在尝试查看字符串中是否有任何 html。

Regex tagRegex = new Regex(@"<\s*([^ >]+)[^>]*>.*?<\s*/\s*\1\s*>")
if(tagRegex.IsMatch(body))
{
  *do something*
}

但由于灾难性的回溯,它在 IsMatch 部分失败。谁能告诉我正则表达式有什么问题吗?

谢谢

最佳答案

在正则表达式中使用*是大多数回溯发生的地方。这就像在说:“那里可能有东西,但也可能没有……所以继续寻找”。这种犹豫不决导致回溯寻找其他替代方案......

您的模式的问题在于,它试图做所有事情,但由于回溯而最终什么也没做。人们需要通过指定要查找的特定内容来保持模式的紧密性,并且仅少量使用*(如果有的话)。

将模式缩短为一条规则,然后向其中添加更多规则。它成为完全合规性和速度之间的权衡;您需要调用该电话。

<小时/>

请参阅 MS 文档 Take Charge of Backtracking了解更多信息。

关于c# - Regex.IsMatch 导致灾难性的回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59414525/

相关文章:

c# - 处理动画工具数据存储的最有效/最快速的方法

java - 如何替换命名组的值

c++ - 如何将 C# 风格的正则表达式转换为 C++ 风格

Javascript 正则表达式消除匹配词之间的困惑

mysql - 如何获取包含字母数字字符+空格的记录

C# 事件未被处理

c# - MSBuild 15 - 命名空间中不存在类型或命名空间 'Fakes'

c# - 如何在 IL 代码中发出三元运算符

c# - 使用数组进行统计(十进制)

php - 寄存器路由中的正则表达式不适用于参数