Skip to main content
 首页 » 编程设计

c#之为什么这个正则表达式在 .NET 中会失败

2024年01月31日27leader

看看这个测试方法:

[ Test ] 
public static void TestRegex() { 
    var goodTextsToTest = new List<string> 
        { 
            "http://google.com", 
            "https://google.com/", 
            "ftp://bugger!!!one1", 
            "ftss://shoot", 
            "somelongergibberish://flkjd", 
            "thescheme://green" 
        }; 
    var badTextsToTest = new List<string> { "bad432:4h//orange", "1ftp://1bugger!!!one1", "IAmTheVeryModelOfAModernMajorGeneral", "" }; 
 
    var regex = new Regex( "^([a-z][a-z0-9+\\.\\-]*)*://", RegexOptions.IgnoreCase ); 
 
    foreach( var txt in badTextsToTest ) 
        Assert.IsFalse( regex.IsMatch( txt ), "Passed but should have failed: " + txt ); 
 
    foreach( var txt in goodTextsToTest ) 
        Assert.IsTrue( regex.IsMatch( txt ), "Failed but should have passed: " + txt ); 
} 

按照目前的写法,此代码永远不会从 var regex = new Regex( "^([a-z][a-z0-9+\\.\\-]*)*://", RegexOptions.IgnoreCase );.代码卡住的输入是“IAmTheVeryModelOfAModernMajorGeneral”。

当输入为“IAmTheVeryModelOfAModernMajorGeneral”时,为什么这个正则表达式会导致无限循环?

奖金问题: 如果您从正则表达式中删除“://”,此代码会完成执行。 IE。 var regex = new Regex( "^([a-z][a-z0-9+\\.\\-]*)*", RegexOptions.IgnoreCase ); 为什么这样修复是吗?

请您参考如下方法:

由于回溯,你的正则表达式,按照现在的设计,将需要超过 87500 步才能完成。查看调试器 here .这就是我们所说的catastrophic backtracking