Respuestas:
Reemplazar [^a-zA-Z0-9 -]
con una cadena vacía.
Regex rgx = new Regex("[^a-zA-Z0-9 -]");
str = rgx.Replace(str, "");
replaceAll
función en lugar de replace
.
return Regex.Replace(str, "[^a-zA-Z0-9_.]+", "", RegexOptions.Compiled);
misma pregunta básica
""
y string.Empty
exactamente lo mismo. stackoverflow.com/questions/151472/…
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 usa 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);
char[] arr = str.Where(c => (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-')).ToArray();
Puedes probar:
string s1 = Regex.Replace(s, "[^A-Za-z0-9 -]", "");
¿Dónde s
está tu cuerda?
Usando System.Linq
string withOutSpecialCharacters = new string(stringWithSpecialCharacters.Where(c =>char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-').ToArray());
La expresión regular es [^\w\s\-]*
:
\s
es mejor usarlo en lugar de espacio ( ), porque puede haber una pestaña en el texto.
Basado en la respuesta a esta pregunta, creé una clase estática y las 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 se pueden usar como:
string example = "asdf1234!@#$";
string alphanumeric = example.ToAlphaNumericOnly();
string alpha = example.ToAlphaOnly();
string numeric = example.ToNumericOnly();
¿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.
Aquí hay una solución rápida amigable de asignación de almacenamiento no regex 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 el truco de longitud de 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);
}
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 simple, ¡así que creo que es mejor!
Aquí hay un método de extensión que usa @ata answer como inspiración.
"hello-world123, 456".MakeAlphaNumeric(new char[]{'-'});// yields "hello-world123456"
o si necesita caracteres adicionales que no sean guiones ...
"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);
}
}
Utilizo una variación de una de las respuestas aquí. Quiero reemplazar espacios con "-" para que sea amigable con SEO y también en minúsculas. Tampoco referencia system.web de 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;
}
Aquí hay una versión muy concisa
myString = myString.replace(/[^A-Za-z0-9 -]/g, "");
Hay una manera mucho más fácil con Regex.
private string FixString(string str)
{
return string.IsNullOrEmpty(str) ? str : Regex.Replace(str, "[\\D]", "");
}
-
debe estar al final de la clase de personaje, o escapar con una barra invertida, para evitar que se use para un rango.