Como faço para remover todos os caracteres não alfanuméricos de uma string, exceto traço?

Como faço para remover todos os caracteres não alfanuméricos de uma string, exceto os caracteres traço e espaço?

   

Substitua [^a-zA-Z0-9 -] por uma string vazia.

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

Eu poderia ter usado o RegEx, eles podem fornecer uma solução elegante, mas eles podem causar problemas de desempenho. Aqui está uma solução

 char[] arr = str.ToCharArray(); arr = Array.FindAll(arr, (c => (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-'))); str = new string(arr); 

Ao usar o framework compacto (que não tem FindAll)

Substitua FindAll por 1

 char[] arr = str.Where(c => (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-')).ToArray(); str = new string(arr); 

1 Comentário por ShawnFeatherly

Podes tentar:

  string s1= Regex.Replace(s,"[^A-Za-z0-9 _]",""); 

Onde está sua corda.

Usando o System.Linq

 string withOutSpecialCharacters = new string(stringWithSpecialCharacters.Where(c =>char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-').ToArray()); 

O regex é [^\w\s\-]* :

É melhor usar em vez de espaço ( ), porque pode haver uma guia no texto.

Com base na resposta para essa pergunta, criei uma class estática e as adicionei. Pensei que poderia ser útil para algumas pessoas.

 public static class RegexConvert { public static string ToAlphaNumericOnly(this string input) { Regex rgx = new Regex("[^a-zA-Z0-9]"); return rgx.Replace(input, ""); } public static string ToAlphaOnly(this string input) { Regex rgx = new Regex("[^a-zA-Z]"); return rgx.Replace(input, ""); } public static string ToNumericOnly(this string input) { Regex rgx = new Regex("[^0-9]"); return rgx.Replace(input, ""); } } 

Então os methods podem ser usados ​​como:

 string example = "asdf1234!@#$"; string alphanumeric = example.ToAlphaNumericOnly(); string alpha = example.ToAlphaOnly(); string numeric = example.ToNumericOnly(); 

Eu fiz uma solução diferente, eliminando os caracteres de controle , que era o meu problema original.

É melhor do que colocar em uma lista todos os caracteres “especiais, mas bons”

 char[] arr = str.Where(c => !char.IsControl(c)).ToArray(); str = new string(arr); 

é mais simples, então acho melhor!

Quer algo rápido?

 public static class StringExtensions { public static string ToAlphaNumeric(this string self, params char[] allowedCharacters) { return new string(Array.FindAll(self.ToCharArray(), c => char.IsLetterOrDigit(c) || allowedCharacters.Contains(c))); } } 

Isso permitirá que você especifique quais caracteres deseja permitir também.

Aqui está uma solução rápida amigável de alocação de heap não-regex que era o que eu estava procurando.

Edição insegura.

 public static unsafe void ToAlphaNumeric(ref string input) { fixed (char* p = input) { int offset = 0; for (int i = 0; i < input.Length; i++) { if (char.IsLetterOrDigit(p[i])) { p[offset] = input[i]; offset++; } } ((int*)p)[-1] = offset; // Changes the length of the string p[offset] = '\0'; } } 

E para aqueles que não querem usar inseguro ou não confiam no hack de comprimento de string.

 public static string ToAlphaNumeric(string input) { int j = 0; char[] newCharArr = new char[input.Length]; for (int i = 0; i < input.Length; i++) { if (char.IsLetterOrDigit(input[i])) { newCharArr[j] = input[i]; j++; } } Array.Resize(ref newCharArr, j); return new string(newCharArr); } 

Eu uso uma variação de uma das respostas aqui. Eu quero replace espaços com “-” por isso é SEO amigável e também fazer minúsculas. Também não faça referência ao system.web da minha camada de serviços.

 private string MakeUrlString(string input) { var array = input.ToCharArray(); array = Array.FindAll(array, c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-'); var newString = new string(array).Replace(" ", "-").ToLower(); return newString; } 

Existe uma maneira muito mais fácil com o Regex.

 private string FixString(string str) { return string.IsNullOrEmpty(str) ? str : Regex.Replace(str, "[\\D]", ""); }