2013-08-16 31 views
0
string subject = "/testfolder 
    subject = Regex.Replace(subject, "|d|", "17"); 
    Console.Write(subject); 

獲得輸出爲17/17o17u17t17g17o17i17n17g17查找和使用正則表達式C#替換

爲什麼上面的查找和替換失敗,應該什麼都不做,而是它在每一個空間填充的替代變量。它甚至需要正則表達式嗎?

回答

9

你知道|d||的意思是or?嘗試逃避它! @"\|d\|"

您的正則表達式相當於""(空字符串)。

這是因爲你必須把它看作

(match of empty string) or (match of letter d) or (match of empty string) 

總是從左至右匹配,停在第一個正賽。正如我們將看到的,只是第一個條件(空串的匹配)在任何地方都是正的,所以它不會去其他比賽。

現在,正則表達式解析器會嘗試在字符串的開頭匹配您的正則表達式。

它在「/」(第一個字符):它是否匹配?是""部分"/"?是的(至少在正則表達式解析器的「思想」中)。現在有趣的是,Regex.Replace將用17替換字符串的匹配部分...但有趣的是,"/"的匹配部分是"",所以它將用"17"替換"/"之前的虛擬空字符串。所以它會變成"17/"

現在它會轉到下一個字符(因爲通常正則表達式將在上一場比賽結束時開始嘗試,但有下面的警告),t,重做相同並替換它與"17t",所以我們在這一點上:

17/17t 

等等。

有一個最後的小動作(從msdn拍攝)

當匹配嘗試通過調用匹配方法重複,正則表達式引擎給空匹配特殊待遇。通常,正則表達式引擎開始搜索下一個匹配,確切地說,在上一次匹配停止的位置。然而,在空匹配之後,正則表達式引擎前進一個字符,然後再嘗試下一場比賽。

+0

我的意思是字符串將從字面上有| d |在它,不是或 –

+3

他說你需要逃避|字符,所以代碼解釋它的權利。 – sealz

+1

@LukeMakk我知道。使用我寫的。 – xanatos

相關問題