2013-07-09 54 views
5

我想寫一個字符串'清理'功能,只允許字母數字字符,再加上其他幾個字符,如下劃線,句號和減號(破折號)字符。您可以構建一個RegEx以用下劃線替換不想要的字符嗎?

目前我們的函數使用源字符串的直接字符迭代,但我試圖將其轉換爲正則表達式,因爲從我一直在閱讀的內容來看,它更清晰和更高效(這似乎是對我而言倒退直接迭代,但我不能簡介,直到我得到一個正常工作RegEx。)

這個問題對我來說是雙重的。一,我知道下面的正則表達式...

[a-zA-Z0-9] 

...相匹配的一系列字母數字字符,但我怎麼也包括下劃線,週期和負字符?你只是用'\'字符將它們轉義出來,並將它們與其餘的括號放在括號內?其次,對於不屬於匹配部分的任何字符(即'?'等其他標點符號),我們希望它替換爲下劃線。

我的想法是相反匹配一系列所需字符,我們匹配不在所需範圍內的單個字符,然後替換它。我認爲正則表達式是包括克拉作爲這樣的括號之間的第一個字符...

[^a-zA-Z0-9] 

這是正確的方法嗎?

+0

Regex.Replace()方法是你所需要的 – terrybozzio

+0

我想通這一點,但請參閱我的問題,或者說上面的兩個問題與它有關。 – MarqueIV

+1

你想反轉你的角色類。即。 '[^ a-zA-Z0-9]',它將匹配所有不是字母數字的。 –

回答

5

大概最有效的方法是設置一個靜態正則表達式來描述要替換的字符。

public static class StringCleaner 
{  
    public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-]", RegexOptions.Compiled | RegexOptions.IgnoreCase); 

    public static string ReplaceInvalidChars(string input) 
    { 
     return invalidChars.Replace(input, "_"); 
    } 
} 

但是,如果你不想正則表達式替換行結束和空白(如空格和製表符),你需要使用一個稍微不同的表達。

public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-\s]", RegexOptions.Compiled | RegexOptions.IgnoreCase); 

而且,這裏有你必須逃脫相匹配的文本字符的規則是什麼:只有當它出現

內用方括號表示一組你必須逃跑,這些字符-#]\任何地方發生^在集合的第一個位置匹配文字字符。在一組之外,您必須轉義這些字符:.$^|{}[]()+?#以匹配文字字符。

更多信息請參見下面的文檔:

+0

其實,我*想*替換所有的空格和行結尾(和行首)!它們不是有效的字符,所以你的第一個是正確的。但是,如果我錯了,糾正我,但是你用'@'字符開始你的字符串,對我來說,這看起來像目標C,而不是C#...或者我錯過了什麼嗎? – MarqueIV

+0

我錯過了一些東西!:)我現在知道在C#中啓動一個字符串基本上會爲你逃脫整個字符串。我喜歡!你的完整性得到了接受的答案。謝謝! :) – MarqueIV

+1

是的,在C#中使用@「在字符串中啓動字符串會使其成爲字面值。以下是解釋它的語言規範部分:http://msdn.microsoft.com/en-us/library/aa691090(v=VS。 71)的.aspx – JamieSee

3

如果你想刪除你不想要的字符,你會得到更好的服務Regex.Replace

string cleaned = Regex.Replace(input, "[^a-zA-Z0-9_.]|-", "_"); 

要包含「 - 」字符,你可以只使用正則表達式或者包括那個角色雖然可能有一種方法可以將它包含在角色類中,但現在它正在逃避我。

編輯:您實際上並不需要明確包含連字符,因爲它無論如何都不匹配類。也就是說,如果你想用下劃線代替連字符,只需使用[^a-zA-Z0-9_.]作爲你的課程......任何與這些課程不匹配的東西都將被替換。但是在班級中加入連字符的正確方法是用反斜線(\-)將其避開(參見\-),或者您可以將它放在班級列表的開頭:[^-a-zA-Z0-9_.]

0

我認爲這將是完美的使用字符串的替換方法。

public string StringClean(string source, char replacement, char[] targets) 
{ 
    foreach(char c in targets) 
    { 
    //... 
    } 
} 

(不是VS所以也許不是完美的代碼)

+0

這不是正則表達式代碼,所以這不適用於問題。 – MarqueIV

0

如果您需要更換不與下劃線你描述的模式中的所有字符做到這一點:

string result = Regex.Replace(YourOriginalString, "[^a-zA-Z0-9_.-]", "_"); 
+0

你是不是應該在最後逃避那個連字符(或者它是隱式逃脫的,因爲它*在最後? – MarqueIV

+0

它的隱含的,只是爲了以防萬一,它的工作。 – terrybozzio

相關問題