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]", ""); }