2013-03-10 38 views
3

我用正則表達式來檢查其正確性字符串(我想允許的字符A-Za-z*space-&%./+)。我的代碼是這樣的:如何在這種情況下使用Regex.Replace?

Regex r = new Regex("^[A-Z0-9.$/+%\\- ]+$"); 
string myString = "ABCDEFGH 12345 $%...  A"; //string ok 

if (r.IsMatch(myString)) 
    System.Console.WriteLine("String alright!"); 

這是工作,一切都很好。現在我只是想,也許我也可以處理不正確的字符串。我想用-替換字符串中的不正確(非正則表達式有效)字符。這可以用Regex.Replace完成。所以我做了這個:

Regex r = new Regex("^[A-Z0-9.$/+%\\- ]+$"); 
string myString = "HELLO WÖRLD ß~# 50.00$"; //Ö,ß,~,# should be replaced by - 

if (r.IsMatch(myString)) 
    System.Console.WriteLine("String alright!"); 
else 
    myString = Regex.Replace(myString, r.ToString(), "-"); 

System.Console.WriteLine(myString); 

那麼這是如此的不工作!作爲輸出,我得到:

HELLO WÖRLD ß~# 50.00$ 

我錯過了什麼?問題是正則表達式的權利?我可以檢查一個字符串是否正確,但是我不能正確使用這個正則表達式的Regex.Replace函數。有沒有辦法使用1個正則表達式來檢查字符串是否有效並使用Regex.Replace

回答

4

你需要另一個表達式來專門匹配這些字符。例如:

[^A-Z0-9.$/+%\- ] 

這可能是用作:

myString = Regex.Replace(myString, @"[^A-Z0-9.$/+%\- ]", "-"); 
+0

啊好吧。也許我不完全理解你的正則表達式和我的正則表達式之間的區別......但是這個正在工作。在這之後我唯一需要改變的是如果我的語句是'(!r.IsMatch(myString))',那麼一切都很好。謝謝! – sabisabi 2013-03-11 07:20:46

3

你的代碼實際上沒有意義。
如果r.IsMatch()返回false,那麼您知道正則表達式與字符串不匹配,因此替換任何匹配都不會產生效果。 (沒有匹配)

相反,你應該創建任何無效字符匹配正則表達式,檢查它是否匹配,如果確實如此,叫.Replace()


此外,您正在濫用正則表達式。

如果你有一個Regex比如說,你應該調用它的Replace實例方法:如果你想(匹配和)替換未在驗證表達式匹配您的人物角色

myString = r.Replace(myString, "-"); 
0

您的更換是不會發生,因爲正則表達式未發現任何更換。

你可以做什麼,使用相同的正則表達式是將'myString'轉換爲字符並檢查每個字符的有效性。

例(從Java,但應該是很容易理解):

if (r.IsMatch(myString)){ 
      System.Console.WriteLine("String alright!"); 
} else { 

    // java iteration 
    for(int i = 0; i < myString.length(); i++){ 
     Character c = myString.charAt(i); 
     if(!c.toString().matches(reg)){ 
      myString = myString.replace(c.toString(), "-"); 
     } 
    } 

}