2013-12-18 4 views
2

Я пытаюсь взять строку и заменить все, что не является A-Z, пробелом. Так, например, "AB $ CD $ EF" должен вывести "AB CD EF"Замена символов не алфавита в строке

Проблема у меня следующая ошибка:

Instance аргумент: не удается преобразовать из 'строку []' в «System .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: // StackOverflow.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

Err ... мой код принимает как буквы нижнего, так и верхнего регистра. Вы можете заметить 'RegexOptions.IgnoreCase' в конструкторе регулярных выражений и сравнения в этом инициализировать' isAlpha'. Но, черт возьми, я изменил код, чтобы сделать его немного яснее. –

+0

К сожалению, я виноват, я не обратил внимания на это! –

0

Вы могли бы использовать Regex.

Это должно заменить верхний и нижний регистр алфавитных символов с пробелами (непроверенных):

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

Мне нравится первый пример, спасибо! Если код Доминика не работает для меня, я буду использовать ваш. – Taurophylax

0

Я бы с регулярным выражением, а не перебором всей строки. Немного более легкая память нужна и быстро.

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

Я не тестировал это напрямую, но концепция довольно проста с помощью регулярного выражения.

Смежные вопросы