2012-01-08 20 views
41

¿Cómo elimino caracteres no alfanuméricos de una cadena y espacios libres en C# con Reemplazar?¿Cómo elimino caracteres no alfanuméricos (espacios incluidos) de una cadena?

Quiero mantener a-z, A-Z, 0-9 y nada más (ni siquiera "" espacios).

"Hello there(hello#)".Replace(regex-i-want, ""); 

debe dar

"Hellotherehello" 

He tratado "Hello there(hello#)".Replace(@"[^A-Za-z0-9 ]", ""); pero se mantienen los espacios.

+1

¿Qué le parece primero definir qué quiere decir exactamente con alfanumérico? ¿Solo quieres A-Z, a-z, 0-9? Unicode tiene muchas más letras y números. – CodesInChaos

+2

Con esa edición, se ve mucho mejor, recuperando mi voto negativo. –

+1

¿Por qué tiene un espacio en su soporte? Y 'string.Replace' no toma una expresión regular en primer lugar. – CodesInChaos

Respuesta

55

En su expresión regular, se han excluido los espacios de ser emparejado (y no se han utilizado Regex.Replace() que había pasado por alto por completo ...):

result = Regex.Replace("Hello there(hello#)", @"[^A-Za-z0-9]+", ""); 

debería funcionar. El + hace que la expresión regular sea un poco más eficiente combinando más de un carácter no alfanumérico consecutivo a la vez en lugar de uno por uno.

Si desea mantener las letras no ASCII/dígitos, también, utilizar la siguiente expresión regular:

@"[^\p{L}\p{N}]+" 

que deja

BonjourmesélèvesGutenMorgenliebeSchüler 

en lugar de

BonjourmeslvesGutenMorgenliebeSchler 
+0

Intenté esto ... está muy cerca pero parece dejar espacios en - ¡Quiero que también se pelen! Gracias. – James

+0

No, no es así. A menos que tenga espacios especiales allí como espacio no rompible ASCII 160 (y la segunda versión también los elimina correctamente). –

+0

Hmmm He intentado lo siguiente: 'cadena t =" hola allí - (efrwef) ";' 'cadena a =" Nuevo: "+ t.Replace (@" [^ \ p {L} \ p { N}] + "," ");' y termina siendo "hola allí - (efrwef)" - completamente sin cambios - Sé que estoy haciendo algo mal aquí. – James

-6

En .Net 4.0 puede utilizar el método IsNullOrWhitespace de la clase String para eliminar los llamados espacios en blanco. Por favor, eche un vistazo aquí http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace.aspx Sin embargo, como @CodeInChaos señaló que hay un montón de caracteres que podrían considerarse como letras y números. Puede usar una expresión regular si solo quiere encontrar A-Za-z0-9.

+0

Hazte a ti y TAN un favor y elimina esto. –

3

O puede hacer esto también:

public static string RemoveNonAlphanumeric(string text) 
    { 
     StringBuilder sb = new StringBuilder(text.Length); 

     for (int i = 0; i < text.Length; i++) 
     { 
      char c = text[i]; 
      if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9') 
       sb.Append(text[i]); 
     } 

     return sb.ToString(); 
    } 

Uso:

string text = SomeClass.RemoveNonAlphanumeric("text LaLa (lol) á ñ $ 123 ٠١٢٣٤"); 

//text: textLaLalol123 
+1

Aunque me gusta el enfoque general, no se ajusta al requisito de solo permitir A-Z, a-z, 0-9. También permite otras letras y dígitos. – CodesInChaos

+0

@CodeInChaos tienes razón. corregido :) – Adrianne

+0

También hay más de 10 dígitos en Unicode. '' son algunos ejemplos. – CodesInChaos

2

El error anterior se utiliza de forma incorrecta Reemplazar (no se necesita de expresiones regulares, gracias CodeInChaos).

El siguiente código debe hacer lo que se especifica:

Regex reg = new Regex(@"[^\p{L}\p{N}]+");//Thanks to Tim Pietzcker for regex 
string regexed = reg.Replace("Hello there(hello#)", ""); 

Esto da:

regexed = "Hellotherehello" 
-2

Usar la siguiente expresión regular para despojar a esos todos los caracteres de la cadena usando expresiones regulares.Reemplazar

([^A-Za-z0-9\s]) 
+0

'string.Replace()' no toma regex como argumento – PostureOfLearning

+0

@PostureOfLearning Gracias por su comentario, pero debería ver la pregunta .. la pregunta no es sobre el método de reemplazo que se trata de la Regex. el uso del método se copia de la pregunta que se proporciona con la expresión regular útil. Por favor devuelva su voto :) –

+2

Entiendo la pregunta y me doy cuenta de que la pregunta también tiene un código inválido. Sin embargo, acepto código inválido en una pregunta ya que están tratando de aprender, pero encuentro que el código incorrecto en una respuesta no es aceptable. Es una respuesta y debería funcionar. Tu respuesta me lleva en la dirección incorrecta cuando intento resolver mi propio problema. Habiendo dicho esto, si quiere cambiarlo, me complacerá retirar la votación;) – PostureOfLearning

0
var text = "Hello there(hello#)"; 

var rgx = new Regex("[^a-zA-Z0-9]"); 

text = rgx.Replace(text, string.Empty); 
+1

Bienvenido en SO. Una pequeña explicación siempre hace que tu respuesta sea más valiosa.En SO, las personas tienden a querer saber por qué, en lugar de cómo. ;) – ForceMagic

2

Y como una operación de sustitución como un método de extensión:

public static class StringExtensions 
{ 
    public static string ReplaceNonAlphanumeric(this string text, char replaceChar) 
    { 
     StringBuilder result = new StringBuilder(text.Length); 

     foreach(char c in text) 
     { 
      if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9') 
       result.Append(c); 
      else 
       result.Append(replaceChar); 
     } 

     return result.ToString(); 
    } 
} 

Y prueba:

[TestFixture] 
public sealed class StringExtensionsTests 
{ 
    [Test] 
    public void Test() 
    { 
     Assert.AreEqual("text_LaLa__lol________123______", "text LaLa (lol) á ñ $ 123 ٠١٢٣٤".ReplaceNonAlphanumeric('_')); 
    } 
} 
9

Puede utilizar LINQ para filtrar los caracteres requeridos:

String source = "Hello there(hello#)"; 

    // "Hellotherehello" 
    String result = new String(source 
    .Where(ch => Char.IsLetterOrDigit(ch)) 
    .ToArray()); 

O

String result = String.Concat(source 
    .Where(ch => Char.IsLetterOrDigit(ch))); 

Y por lo que no tienen necesidad de expresiones regulares.

+0

¡Gran adición! Sería interesante conocer el rendimiento relativo de esto a la solución Regex. Fuera de la puerta, se lee mucho mejor. –

+1

Una prueba rápida en LinqPad sugiere que hay una diferencia insignificante entre esto e incluso una solución Regex compilada. La legibilidad gana para mí. –

Cuestiones relacionadas