2013-12-18 127 views
2

我正在嘗試取一個字符串並用空格替換所有不是A-Z的字符。因此,例如,「AB $ CD $ EF」應該輸出「AB CD EF」替換字符串中的非字母字符

我有如下錯誤的問題:

實例參數:無法從轉換「字符串[]」到「系統.Linq.IQueryable」

代碼:

 string[] alpha = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; 
     string inVAR = textBox1.Text.ToUpper(); 
     string outVAR; 

     StringBuilder sb = new StringBuilder(inVAR); 

     foreach (int i in inVAR) // inVAR because stringbuilders won't work with foreach 
     { 
      if (alpha.Contains(sb[i])) 
      { 
       outVAR += sb[i].ToString(); 
      } 
      else 
      { 
       sb[i] = ' '; 
      } 
     } 

另外,如果你有做AZ陣列的不同方式,我很開放! :P

爲了記錄在案:是的,我已經包含了System.Linq的

+0

你看過嗎? HTTP://計算器。com/questions/17457677/how-can-i-remove-none-alphabet-chars-from-a-string –

回答

6

也許你可以使用正則表達式爲:

Regex rgx = new Regex("[^a-zA-Z -]"); 
str = rgx.Replace(str, " ");          

然後你就可以取代它或任何你想用它做什麼。 我希望我能理解你的問題;)

+0

他想用空格替換,而不是空格。 –

+0

是的,只是編輯;)就像我說的,他可以用它做任何他想做的事情......但確定,修正:) –

+0

完美,非常感謝! – Taurophylax

2

你可以用幾行簡單的代碼使用正則表達式來做到這一點。

string inVAR = textBox1.Text.ToUpper(); 
string pattern = "[^A-Z]"; 
string replacement = " "; 
Regex rgx = new Regex(pattern); 
string result = rgx.Replace(inVAR, replacement); 
1

您的代碼很混亂。我想你想要的是:

string[] alpha = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; 
    string inVAR = textBox1.Text.ToUpper(); 
    string outVAR; 

    StringBuilder sb = new StringBuilder(inVAR); 

    foreach (char c in inVAR) // inVAR because stringbuilders won't work with foreach 
    { 
     if (!alpha.Contains(c)) 
     { 
      sb[i] = ' '; 
     } 
    } 

    outVAR = sb.ToString(); 

你真的不需要alpha陣列。您可以撥打char.IsUpper

if (!char.IsUpper(c)) 

或者,正如其他人所指出的那樣,你可以使用正則表達式完成這個任務。

0

你可以試試這個:

Regex rxNonAlpha = new Regex("[^A-Z]" , RegexOptions.IgnoreCase) ; 
string someText = GetSomeText() ; 
string tidiedText = rxNonAlpha.Replace(someText , " ") ; 

或者,採取的事實,即ASCII/Unicode的A-Z和a-z是連續的代碼點:

string Tidy(string s) 
{ 
    StringBuilder sb = new StringBuilder(s.Length) ; 

    foreach (char c in s) 
    { 
    bool isLowerCase = (c >= 'a' && c <= 'z') ; 
    bool isUpperCase = (c >= 'A' && c <= 'Z') ; 
    bool isAlpha  = isLowerCase || isUpperCase ; 
    sb.Append(isAlpha ? c : ' ') ; 
    } 

    return sb.ToString() ; 
} 
+0

也許你應該添加像「a-z」這樣的低位字符! ;) –

+0

錯誤...我的代碼接受小寫和大寫字母。您可能會注意到正則表達式構造函數中的'RegexOptions.IgnoreCase',以及初始化'isAlpha'的比較。但是,嘿,我調整了代碼,使其更清晰一些。 –

+0

對不起,我的錯,我沒注意那個! –

0

你可以使用正則表達式。

這應該與(未經測試)一個空格替換上小寫字母字符:

Regex rgx = new Regex("[^a-zA-Z]"); 
outVAR = rgx.Replace(textBox1.Text, " "); 
3

你有很多選擇。對於恩,

var strNew1 = Regex.Replace("AB$CD$EF", @"[^A-Z]", " "); 

var strNew2 = new string("AB$CD$EF".Select(c => c >= 'A' && c <= 'Z' ? c : ' ') 
            .ToArray()); 
+0

我喜歡第一個例子,謝謝!如果Dominic的代碼不適合我,我會用你的。 – Taurophylax

0

我會去與正則表達式,而不是通過整個字符串進行迭代。內存需求略少,速度也很快。

string inputString = "[whatever your string is]"; 
    Regex replacelist = new Regex("[;\\\\/:*?\"<>|&'$]"); 
    string outputString = replacelist.Replace(inputString," "); 

我還沒有直接測試過,但這個概念對於正則表達式很簡單。