我知道有很多类似的问题,但这是特定于我的正则表达式的。 我正在尝试查看字符串中是否有任何 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/