看看这个测试方法:
[ 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
