做一些知道爲什麼這段代碼的輸出:Regex.Match,startat和^(字符串的開始)
Regex re = new Regex("^bar", RegexOptions.Compiled);
string fooBarString = @"foo bar";
Match match1 = re.Match(fooBarString, 4);
Console.WriteLine(String.Format("Match 1 sucess: {0}", match1.Success));
Match match2 = re.Match(fooBarString.Substring(4));
Console.WriteLine(String.Format("Match 2 sucess: {0}", match2.Success));
是:
比賽1個sucess:假
比賽2個sucess:真
?
預期的行爲當然是「真」與「真」(不然我真的不知道什麼是「startat」參數應該是有用的)的。
的想法是,這個正則表達式匹配(也有很多很多)被稱爲非常頻繁(每秒數tousand),我們發現,子操作查殺內存性能。
感謝您的幫助!
重新表現:如果'Substring'創建一個新的'String'對象與底層'Char's的新副本(我敢肯定它),你會做除了是*到*正則表達式匹配。事實上,OP確實說問題出在內存使用上,而不是速度,這使'Substring'成爲主要的嫌疑犯。幸運的是,作爲@ Maxime的[回覆](http://stackoverflow.com/questions/5884922/regex-match-startat-and-start-of-string/5885087#5885087)顯示,它不是需要的。 – 2011-05-04 17:50:11
@Alan - 是的,我犯了錯誤的思考性能的速度而不是記憶(不是說'Substring'不會是一個速度命中,順便說一句,它可能比正則表達式本身要小得多) 。 @Maxime更好地理解海報想要做什麼,所以他得到了我的+1。重新使用'Substring'方法 - 這[構造一個新的字符串](http://msdn.microsoft.com/zh-cn/library/default.aspx)。com/en-us/library/aka44szs.aspx),因爲字符串在C#中是不可變的。 – 2011-05-04 18:59:23
@JustinMorgan實際上,不變性是可以不必創建一個新字符串的可能性,這可能是字符串可能指向子字符串。它不這樣做的原因與垃圾收集有關。 – mirhagk 2014-01-12 02:54:53