2013-11-13 4 views
5

Привет, я пытаюсь удалить специальные символы из пользовательских входов.Специальные символы Regex

 public void fd() 
     { 
      string output = ""; 
      string input = Console.ReadLine(); 
      char[] charArray = input.ToCharArray(); 

      foreach (var item in charArray) 
      { 

       if (!Char.IsLetterOrDigit(item)) 
       { 

        \\\CODE HERE     } 

      } 

      output = new string(trimmedChars); 
      Console.WriteLine(output); 
     } 

В конце я возвращаюсь к веревке. Мой код удаляет только один специальный символ в строке. Кто-нибудь есть какие-либо предложения по более простому способу вместо

+0

'int index = Array.IndexOf (charArray, item);' возможно, не делает то, что вы хотите, чтобы он делал. – Warty

ответ

2

Проблема с вашим кодом заключается в том, что вы берете данные из charArray и помещаете результат в trimmedChars за каждое изменение, которое вы делаете, поэтому каждое изменение будет игнорировать все предыдущие изменения и работать с оригиналом. В конце вы имеете только последнее изменение.

Еще одна проблема с кодом заключается в том, что вы используете IndexOf, чтобы получить индекс символа, но он получит индекс первой случайности этого символа, а не индекс, в котором вы получили этот символ. Например, когда вы находитесь на втором ! в строке "foo!bar!", вы получите индекс первого.

Вам не нужно включать строку в массив для работы с символами в строке. Вы можете просто прокрутить индекс символов в строке.

Обратите внимание, что вы также должны проверить значение индекса при просмотре символов до и после, чтобы вы не пытались просмотреть символы, которые находятся за пределами строки.

public void fd() { 
    string input = Console.ReadLine(); 
    int index = 0; 
    while (index < input.Length) { 
    if (!Char.IsLetterOrDigit(input, index) && ((index == 0 || !Char.IsLetterOrDigit(input, index - 1)) || (index == input.Length - 1 || !Char.IsLetterOrDigit(input, index + 1)))) { 
     input = input.Remove(index, 1); 
    } else { 
     index++; 
    } 
    } 
    Console.WriteLine(input); 
} 
+0

+1 для правильной реализации и 'Char.IsLetterOrDigit' (забыл об этом). Это должно быть принято –

+0

да это работает отлично, единственное, что если у меня есть два специальных символа в конце, например, dog $$, он удалит только один, а не оба –

+0

@CalvinJones, это устранит их обоих, попробовали ли вы это для 'dog $$'?Я пробовал и получил 'dog' –

4

Вы имеете хорошую реализацию, просто рассмотреть вопрос об использовании следующего кода, который лишь немного короче, но имеет немного более высокие абстракции

var input = " [email protected]'s! "; 

Func<char, bool> isSpecialChar = ch => !char.IsLetter(ch) && !char.IsDigit(ch); 

for (int i = 1; i < input.Length - 1; i++) 
{ 
    //if current character is a special symbol 
    if(isSpecialChar(input[i])) 
    { 
     //if previous or next character are special symbols 
     if(isSpecialChar(input[i-1]) || isSpecialChar(input[i+1])) 
     { 
      //remove that character 
      input = input.Remove(i, 1); 
      //decrease counter, since we removed one char 
      i--; 
     } 
    } 
} 
Console.WriteLine(input); //prints " [email protected]'s " 

Новая строка будет создаваться каждый раз, когда вы звоните Remove. Используйте StringBuilder для большего количества решений для работы с памятью.

+0

Вызов 'Удалить' в строке не меняет строку, поэтому код ничего не делает. Вам нужно назначить результат обратно переменной. – Guffa

+0

@ Guffa это 'StringBuilder',' Remove' возвращает 'this' в основном –

+0

Извините, не видел, что вы использовали StringBuilder. – Guffa

0

Прошел некоторое время, так как я попал на C#, но рег ех может быть полезным

string input = string.Format("{0}! ", Console.ReadLine()); 
Regex rgx = new Regex("(?i:[^a-z]?)[.](?i:[^a-z]?)"); 
string output = rgx.Replace(input, "$1$2"); 

Регулярного выражение ищет персонаж с не-буквенным символом на левом или правом, и заменяет его ни с чем.

+0

. Это на самом деле добавляет специальный символ в строку. –

+0

Ой, уп ... Мой второй винт сегодня вечером. Будет исправлено и отредактировано. - Подождите, вы уверены? Он должен принимать «a7z» и игнорировать его, но «a?» и замените его на «a» ... Я что-то пропустил? –