2017-02-10 86 views
1

我有下面的代碼片段:正則表達式反向引用替換怪胎

var escapedBlock = Regex.Escape(retString); 
var escapedSearch = Regex.Escape(searchText); 

string highlightedString = Regex.Replace(escapedBlock, "(" + escapedSearch + ")", Regex.Escape("<span style='background-color: #FFFF00'>") + "$1" + Regex.Escape("</span>"), RegexOptions.IgnoreCase); 
return Regex.Unescape(highlightedString); 

這需要文本(retString)塊,並返回基於您傳遞給它(searchText)參數突出顯示的字符串。我使用反向引用來匹配第一個匹配的組,以確保匹配的大小寫保留在返回的突出顯示的文本中。

這順順當當工作,除了一個場景:一個數字,後一個時期。

.5 - works
5 - works
test - works
5. - broken

當搜索.5正常工作,尋找6.5不 - 的Replace方法似乎並沒有進行匹配的。

我最初的嫌疑人有做逃避任何的反向引用($1)是值的實際結果的東西,但如果我直接逃離反向引用我最終得到一堆錯誤無效轉義字符。

我在這裏錯過了什麼?

+1

這是因爲您在轉義*輸入*字符串時在點之前添加了一個文字''''。爲什麼要逃避?我認爲你需要刪除'var escapedBlock = Regex.Escape(retString);'並且在'retString'上應用正則表達式替換,並返回'highlightedString'而不需要消除。 –

+0

大量逃避那裏。當使用_literal_作爲正則表達式時,您只需要轉義字面值。在這種情況下,'escapedSearch'。不要做任何其他的逃跑。 – sln

回答

2

你點之前逃離輸入字符串時,添加文字\5\.模式的匹配5.,不5\.。您需要刪除var escapedBlock = Regex.Escape(retString);並在retString上應用Regex.Replace,並返回highlightedString而不進行轉義。

使用

var escapedSearch = Regex.Escape(searchText); 
var highlightedString = Regex.Replace(retString, escapedSearch, 
    "<span style='background-color: #FFFF00'>$&</span>"), 
    RegexOptions.IgnoreCase); 
return highlightedString; 

注意你不需要捕獲組訪問了全場比賽的值,你可以使用反向引用$&