2012-06-18 78 views
1

如何使用C#正則表達式字符串中的某些字符?C#正則表達式來逃避某些字符

This is a test for % and ' thing? -> This is a test for \% and \' thing? 
+0

什麼「某些人物」逃避如何?出於什麼目的? – Oded

+0

這是針對來自C#後端的MySQL查詢,用戶可以輸入%,除非對其進行修改,否則將返回所有行。爲了防萬一,我還想換掉其他角色,但現在試試%和'。 –

+1

'string.Replace'不夠好? – Oded

回答

2
resultString = Regex.Replace(subjectString, 
    @"(?<!  # Match a position before which there is no 
    (?<!\\) # odd number of backlashes 
    \\   # (it's odd if there is one backslash, 
    (?:\\\\)* # followed by an even number of backslashes) 
    ) 
    (?=[%']) # and which is followed by a % or a '", 
    @"\", RegexOptions.IgnorePatternWhitespace); 

不過,如果你想保護自己免受惡意的SQL查詢,正則表達式是不正確的方式去。

+0

這似乎將\\%添加到字符而不是\% –

+0

它添加了一個反斜槓。如果你打印它,它將顯示爲兩個反斜槓,因爲'\%'不是像'\ n'這樣的真正的轉義序列。或者我在這裏誤解了什麼? –

+0

什麼是馬上與MySQL和LIKE一起去?這需要很長時間才能搜索,因爲%正在被使用,它正在掃描所有的表格,而不是僅僅使用%來拉回項目。 –

0
var escapedString = Regex.Replace(input, @"[%']", @"\$1"); 

這幾乎是所有你需要的。在方括號內,你應該把每個你希望用一個反斜槓(可能包括反斜槓字符本身)轉義的字符。

+0

只有在角色尚未轉義的情況下,此功能纔有效。然後你會使用這種方法逃避他們。 –

0

我不認爲這可能與不錯的時尚正則表達式來完成,但是你可以簡單地運行一個循環:

var specialChars = new char[]{'%',....}; 
var stream = ""; 
for (int i=0;i<myStr.Length;i++) 
{ 
    if (specialChars.Contains(myStr[i]) 
    { 
     stream+= '\\'; 
    } 
    stream += myStr[i]; 
} 

(1)你可以使用StringBuilder從太多的字符串創建,以防止。

+0

這將unescape已經逃脫的角色。所以'foo \%bar'將變成'foo \\%bar'。 –

+0

@TimPietzcker,恕我直言,通過當前問題陳述'foo \%bar'應該是'foo \\%bar'。 –

+0

不是。他談論的是用戶能夠提供一個包含'%'的字符串,該字符串需要被轉義,所以他們不會搞亂他的MySQL查詢。如果用戶可以通過在輸入中提供'\%'來規避這種情況,那麼它就會失敗。雖然,邁克沒有明確指出這一點。最有可能的正則表達式不是這個的正確工具。 –

相關問題