2011-05-04 55 views
15

做一些知道爲什麼這段代碼的輸出: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),我們發現,子操作查殺內存性能。

感謝您的幫助!

回答

12

根據MSDN

如果要限制匹配,從而 它開始在字符串中的特定 字符位置和 正則表達式引擎不 掃描字符串的其餘部分爲一個 匹配,錨定正則表達式 以\ G(在左側爲左 到右圖案,或在合適的 用於右到左圖案)。這 限制匹配,所以它必須在startat時恰好開始 。

的正則表達式與整個字符串匹配,您將需要使用\ G變的,而不是^

http://msdn.microsoft.com/en-us/library/3583dcyh.aspx

0

聽起來你是對的 - 你感到困惑的^意義。 ^意味着您正在使用的產品線的開始。 ^bar將只匹配開始與「酒吧」,你已經在那裏用Substring人爲地完成。如果你解釋你想要做什麼,我們可能會幫助你。

順便提一句,Substring應該是顯着比大多數正則表達式操作更快。如果這是導致你的表現的原因,我會很驚訝。

+0

重新表現:如果'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

+0

@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

+0

@JustinMorgan實際上,不變性是可以不必創建一個新字符串的可能性,這可能是字符串可能指向子字符串。它不這樣做的原因與垃圾收集有關。 – mirhagk 2014-01-12 02:54:53