Avatar ·

Como remover todos os caracteres de uma string, exceto letras, números e hífen, em C#?

Solução com expressão regular

Sua tarefa é resolvida de forma muito simples com o padrão [^a-zA-Zа-яА-Я0-9 -]:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string input = "Hello-World! How are you? (test) 123-456 #2024";
        string pattern = @"[^a-zA-Zа-яА-Я0-9 -]";
        string result = Regex.Replace(input, pattern, "");
        
        Console.WriteLine(result);
        // Output: Hello-World How are you test 123-456 2024
    }
}

Observe que o padrão inclui:

  • a-zA-Z - letras latinas
  • а-яА-Я - letras cirílicas
  • 0-9 - dígitos
  • (espaço) - para preservar espaços
  • - - hífen

O acento circunflexo ^ dentro dos colchetes nega a seleção, removendo tudo que não está na lista.

Alternativa com IsLetterOrDigit e Unicode

Se você quiser evitar problemas com codificação de caracteres cirílicos, pode usar a abordagem baseada em Unicode:

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        string input = "Hello-World! How are you? (test) 123-456 #2024";
        var allowedChars = input.Where(c => 
            char.IsLetter(c) || 
            char.IsDigit(c) || 
            c == '-' || 
            c == ' '
        ).ToArray();
        
        string result = new string(allowedChars);
        Console.WriteLine(result);
    }
}

Este método automaticamente reconhece letras de qualquer alfabeto (incluindo cirílico) através de char.IsLetter, além de dígitos, hífen e espaço.

Tags: C#, strings, expressões regulares, limpeza de strings