una reemplazar quitar caracteres cadena c# regex

c# - reemplazar - ¿Cómo elimino todos los caracteres no alfanuméricos de una cadena excepto el guión?



quitar caracteres de una cadena c# (12)

¿Quieres 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))); } }

Esto le permitirá especificar qué caracteres desea permitir también.

¿Cómo elimino todos los caracteres no alfanuméricos de una cadena excepto los caracteres de guión y espacio?


Aquí hay un método de extensión usando la respuesta @ata como inspiración.

"hello-world123, 456".MakeAlphaNumeric(new char[]{''-''});// yields "hello-world123456"

o si necesita caracteres adicionales que no sean guión ...

"hello-world123, 456!?".MakeAlphaNumeric(new char[]{''-'',''!''});// yields "hello-world123456!" public static class StringExtensions { public static string MakeAlphaNumeric(this string input, params char[] exceptions) { var charArray = input.ToCharArray(); var alphaNumeric = Array.FindAll<char>(charArray, (c => char.IsLetterOrDigit(c)|| exceptions?.Contains(c) == true)); return new string(alphaNumeric); } }


Aquí hay una solución rápida que no es una expresión regular de asignación de pila, que era lo que estaba buscando.

Edición 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''; } }

Y para aquellos que no quieren usar inseguro o no confían en la longitud de la cadena.

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); }


Basándome en la respuesta a esta pregunta, creé una clase estática y la agregué. Pensé que podría ser útil para algunas personas.

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

Entonces los métodos pueden ser utilizados como:

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


Hay una manera mucho más fácil con Regex.

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


He hecho una solución diferente, eliminando los caracteres de Control , que era mi problema original.

Es mejor que poner en una lista todos los caracteres "especiales pero buenos"

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

Es más sencillo, así que creo que es mejor!


La expresión regular es [^/w/s/-]* :

/s es mejor usar en lugar de espacio ( ), porque puede haber una pestaña en el texto.


Podría haber usado RegEx, pueden proporcionar una solución elegante pero pueden causar problemas de rendimiento. Aquí hay una solución

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

Cuando se utiliza el marco compacto (que no tiene FindAll)

Reemplace FindAll con 1

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

1 Comentario de ShawnFeatherly


Puedes probar:

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

Donde s es tu cadena.


Utilizando System.Linq

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


Yo uso una variación de una de las respuestas aquí. Quiero reemplazar los espacios con "-", por lo que es amigable con SEO y también en minúsculas. También no hace referencia a system.web desde mi capa de servicios.

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


Reemplace [^a-zA-Z0-9 -] con una cadena vacía.

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