2010-07-09 11 views

Respuesta

644

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

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

Merece la pena mencionar que '-' debe estar al final de la clase de caracteres, o se ha escapado con una barra invertida, para evitar que se use para un rango. –

+0

Estoy usando ASP clásico (no C# como la pregunta original está etiquetada) - si ingreso: 50025454 $ esto funciona bien, pero si ingreso 50025454 $$, esto falla. (Necesito agregar + a la expresión regular). ¿Es esto lo mismo en C#? – Dan

+0

Dicho esto, usando Regex rgx = new Regex ("[^ a-zA-Z0-9 -] +") y tratando 5002 $ 5454 $ aún falla. – Dan

17

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

\s es mejor usar en lugar del espacio (), porque puede haber una ficha en el texto.

+1

a menos que quiera eliminar pestañas. –

+0

... y saltos, y todos los demás caracteres considerados "espacios en blanco". –

+2

Esta solución es muy superior a las soluciones anteriores ya que también admite caracteres internacionales (no ingleses). string s = "Mötley Crue 日本人: の;; y; Kanji 愛 y Hiragana あ い; cadena r = Regex.Replace (s, "[^ \\ w \\ s -] *", ""); Lo anterior produce r con: Mötley Crue 日本人 の 氏 名 y Kanji 愛 y Hiragana あ い – danglund

37

que puede probar:

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

Dónde s es su cadena.

+1

OP preguntó por el guión no subrayar –

303

Podría haber usado RegEx, pueden proporcionar una solución elegante pero pueden causar problemas de rendimiento. Aquí es 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)

Reemplazar FindAll con

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

str = new string(arr); 

Comment by ShawnFeatherly

+35

en mi prueba, esta técnica fue mucho más rápido. para ser precisos, era apenas por debajo de 3 veces más rápido que la técnica Regex Replace. – Dan

+27

También maneja caracteres Unicode, no solo US ASCII. – user755327

+9

El marco compacto no tiene FindAll, puede reemplazar FindAll con 'char [] arr = str.Where (c => (char.IsLetterOrDigit (c) || ​​char.IsWhiteSpace (c) || ​​c == '- ')). ToArray(); ' – ShawnFeatherly

33

Usando System.Linq

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

he hecho una solución diferente, eliminando el control caracteres, lo cual era mi problema original.

Es mejor que poner en una lista todos los "especial, pero bueno" char de

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

Está más simple, así que creo que sea mejor!

9

Basado en la respuesta para 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, ""); 
    } 
} 

A continuación, los métodos se pueden utilizar como:

string example = "[email protected]#$"; 
string alphanumeric = example.ToAlphaNumericOnly(); 
string alpha = example.ToAlphaOnly(); 
string numeric = example.ToNumericOnly(); 
2

quieren 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.

-1

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

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

solo reemplaza los caracteres no numéricos – frostymarvelous

0

Utilizo una variación de una de las respuestas aquí.Quiero reemplazar espacios con "-" para que sea amigable con SEO y también para minúsculas. Tampoco hace referencia al sistema.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; 
} 
1

Aquí hay una solución rápida de asignación de montón 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 inseguros o no confían en el hack 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); 
} 
Cuestiones relacionadas