C# 为什么这个正则表达式在.NET中失败?
看看这个测试方法:C# 为什么这个正则表达式在.NET中失败?,c#,.net,regex,C#,.net,Regex,看看这个测试方法: [ Test ] public static void TestRegex() { var goodTextsToTest = new List<string> { "http://google.com", "https://google.com/", "ftp://bugger!!!one1", "ftss://shoot",
[ 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;返回;。代码被卡住的输入是一个非常著名的基本输入
为什么这个正则表达式在输入为IAMTheveryModerNMajorGeneral时会导致无限循环
奖金问题:
如果从正则表达式中删除:/,则此代码将完成执行。即var regex=new regex^[a-z][a-z0-9+\\.\\-]**,RegexOptions.IgnoreCase;为什么要这样做呢?您的正则表达式(按现在的设计)将需要87500多个步骤才能完成,因为它是回溯的。见脱布格。这就是我们所说的您的正则表达式,按照现在的设计,由于回溯,它需要87500多个步骤才能完成。见脱布格。这就是我们所说的让我们不要把重点放在正则表达式的意图上,也不要放在正则表达式如何更好上。这个特定的表达式是如何在这个特定的输入中失败的。@托马斯:斜杠不是特殊字符。灾难性的回溯?它对字符串IVeInformationVegetableanimalAdministrator的性能如何?我们不要把重点放在正则表达式的意图上,或者它如何更好。这个特定的表达式如何在这个特定的输入中失败。@托马斯:斜杠不是特殊字符。灾难性的回溯?它在字符串IVeInformationVegetableanimalAdministral上如何执行?@PanagiotisKanavos一些语言将永远运行,另一些语言将抛出堆栈溢出…或运行时。4.5.2增加了尾部递归优化,如果递归调用是最后一次调用,则重用堆栈,因此不会导致堆栈溢出。我怀疑任何为函数式编程优化的语言/运行时都会表现出same@PanagiotisKanavos一些语言将永远运行,另一些语言将抛出堆栈溢出…或运行时。4.5.2增加了尾部递归优化,如果递归调用是最后一次调用,则重用堆栈,因此不会导致堆栈溢出。我怀疑任何为函数式编程优化的语言/运行时都会表现出相同的行为