2013-08-14 3 views
0

Я хочу заменить некоторые недопустимые символы в имени файла, загруженного в мое приложение.Алгоритм низкой сложности для удаления/замены специальных символов

Я искал к чему-то в Интернете и нашел некоторые сложные алгоритмы, чтобы сделать это, вот один:

 public static string RemoverAcentuacao(string palavra) 
     { 
      string palavraSemAcento = null; 
      string caracterComAcento = "áàãâäéèêëíìîïóòõôöúùûüçáàãâÄéèêëíìîïóòõÖôúùûÜç, ?&:/!;ºª%‘’()\"”“"; 
      string caracterSemAcento = "aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC___________________"; 

      if (!String.IsNullOrEmpty(palavra)) 
      { 
       for (int i = 0; i < palavra.Length; i++) 
       { 
        if (caracterComAcento.IndexOf(Convert.ToChar(palavra.Substring(i, 1))) >= 0) 
        { 
         int car = caracterComAcento.IndexOf(Convert.ToChar(palavra.Substring(i, 1))); 
         palavraSemAcento += caracterSemAcento.Substring(car, 1); 
        } 
        else 
        { 
         palavraSemAcento += palavra.Substring(i, 1); 
        } 
       } 

       string[] cEspeciais = { "#39", "---", "--", "'", "#", "\r\n", "\n", "\r" }; 

       for (int q = 0; q < cEspeciais.Length; q++) 
       { 
        palavraSemAcento = palavraSemAcento.Replace(cEspeciais[q], "-"); 
       } 

       for (int x = (cEspeciais.Length - 1); x > -1; x--) 
       { 
        palavraSemAcento = palavraSemAcento.Replace(cEspeciais[x], "-"); 
       } 

       palavraSemAcento = palavraSemAcento.Replace("+", "-").Replace(Environment.NewLine, "").TrimStart('-').TrimEnd('-').Replace("<i>", "-").Replace("<-i>", "-").Replace("<br>", "").Replace("--", "-"); 
      } 
      else 
      { 
       palavraSemAcento = "indefinido"; 
      } 

      return palavraSemAcento.ToLower(); 
     } 

Там есть способ сделать это с менее сложным алгоритмом?

Я думаю, что этот алгоритм очень сложный для чего-то не слишком сложного, но я не могу думать ни о чем другом.

+1

Если это сработает, почему вам все равно, насколько он сложный? – JJJ

+0

Вы можете попытаться использовать скомпилированные выражения regurlar – alex

+0

, что код делает больше, чем просто удаление всех экземпляров символов с помощью набора char list ... если вы * нуждаетесь в этой более сложной логике, то в этом вопросе гораздо меньше выбора. Если вам нужно удалить все экземпляры определенных символов, это намного проще, чем этот код. – Servy

ответ

-1

Вот очень простой метод, который я использовал недавно.

Надеюсь, это соответствует вашим требованиям. Честно говоря, код немного трудно читать из-за языка объявлений переменных.

List<char> InvalidCharacters = new List<char>() { 'a','b','c' };   

    static string StripInvalidCharactersFromField(string field) 
    { 
     for (int i = 0; i < field.Length; i++) 
     { 
      string s = new string(new char[] { field[i] }); 
      if (InvalidCharacters.Contains(s)) 
      { 
       field = field.Remove(i, 1); 
       i--; 
      } 
     } 

     return field; 
    } 
+0

Он не хочет их удалять, он хочет их заменить (несмотря на название). – hatchet

+0

Это нечестивый неэффективный алгоритм, а также ... – Servy

+2

@Servy замечательный вклад, как обычно. Ты здесь настоящий восторг. – Michael

0

решение с использованием регулярных выражений:

string ReplaceSpecial(string input, string replace, char replacewith) 
{ 
    char[] back = input.ToCharArray(); 
    var matches = Regex.Matches(String.Format("[{0}]", replace), input); 
    foreach (var i in matches) 
     back[i.Index] = replacewith; 
    return new string(back); 
} 

Несколько более простое решение с использованием string.replace:

string ReplaceSpecial(string input, char[] replace, char replacewith) 
{ 
    string back = input; 
    foreach (char i in replace) 
     back.Replace(i, replacewith); 
    return back; 
} 
1

Я хочу, чтобы заменить некоторые недопустимые символы в имени файл

, если это действительно то, что вы хотите, то легко

string ToLegalFileName(string s) 
{ 
    var invalidChars = new HashSet<char>(Path.GetInvalidFileNameChars()); 
    return String.Join("", s.Select(c => invalidChars.Contains(c) ? '_' : c)); 
} 

если ваше намерение состоит в том, чтобы заменить акцентированные символы с их ASCii коллегами затем

string RemoverAcentuacao(string s) 
{ 
    return String.Join("", 
      s.Normalize(NormalizationForm.FormD) 
      .Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)); 
} 

и это третья версия, которая заменяет акцентированные си + другие символы с '_'

string RemoverAcentuacao2(string s) 
{ 
    return String.Join("", 
      s.Normalize(NormalizationForm.FormD) 
      .Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
      .Select(c => char.IsLetterOrDigit(c) ? c : '_') 
      .Select(c => (int)c < 128 ? c : '_')); 
} 
+0

Мне понравилась ваша предыдущая версия ;-) На самом деле я использую то, что вы предложили сейчас, в подобной форме - это делает имена файлов правильными, но меняет их немного. Просто превращение акцентированных букв в их неосвещенные, возможно, более плавные и более на линии с вопросом здесь. Было бы здорово найти простой способ изменить акценты. Существует, по крайней мере, возможность сортировки без учета акцентов, возможно, такая трансформация также возможна. – citykid

0
static string RemoverAcentuacao(string s) 
{    
     string caracterComAcento = "áàãâäéèêëíìîïóòõôöúùûüçáàãâÄéèêëíìîïóòõÖôúùûÜç, ?&:/!;ºª%‘’()\"”“"; 
     string caracterSemAcento = "aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC___________________"; 
     return new String(s.Select(c => 
     { 
      int i = caracterComAcento.IndexOf(c); 
      return (i == -1) ? c : caracterSemAcento[i]; 
     }).ToArray()); 
} 
Смежные вопросы