2009-05-25 15 views
12

quiero para asegurarse de que una cadena tiene sólo caracteres en este rangouna cadena

[az] & & [AZ] & & [0-9] & & [-]

por lo que todas las letras y números más el guión. He intentado esto ...

C# Aplicación:

 char[] filteredChars = { ',', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '{', '}', '[', ']', ':', ';', '"', '\'', '?', '/', '.', '<', '>', '\\', '|' }; 
     string s = str.TrimStart(filteredChars); 

Este TrimStart() sólo parece funcionar con letras sin caracteres otehr como $% etc

¿He implemento mal? ¿Hay una mejor manera de hacerlo?

sólo quiero evitar un bucle a través del índice de cada cadena de comprobar, ya que habrá una gran cantidad de cadenas que hacer ...

Pensamientos?

Gracias!

+0

Debe verificar que la entrada sea válida en lugar de lo que no debería tomar. Usa Regex para verificar tu cadena. – David

Respuesta

30

Parece una razón perfectamente válida para usar un regular expression.

bool stringIsValid = Regex.IsMatch(inputString, @"^[a-zA-Z0-9\-]*?$"); 

En respuesta al comentario de Miguel, que podría hacer esto para eliminar todos los caracteres no deseados:

string cleanString = Regex.Replace(inputString, @"[^a-zA-Z0-9\-]", ""); 

Tenga en cuenta que el símbolo de intercalación (^) se coloca ahora dentro la clase de caracteres, por lo tanto su negación (haciendo coincidir cualquier personaje no permitido).

+0

Un pequeño descargo de responsabilidad: Acabo de hacer el patrón desde lo alto de mi cabeza, por lo que podría no ser exactamente lo que estás después. Podrás encontrar la información que necesitas para construir tu patrón ideal si sigues el enlace. –

+0

Creo que quería eliminar los caracteres que no deseaba, sin embargo ... – miguel

+3

Debe colocar un símbolo @ delante de la cadena para que no intente escapar de: - Regex.Replace (s, @ "[^ A-z0-9 \ -] "," "); – Joel

1

¿Por qué no usar simplemente reemplazar? Trimstart solo eliminará los caracteres iniciales de su lista ...

+0

Porque entonces tendré que tener un montón de declaraciones de reemplazo ... – Gabe

+0

simplemente escriba un ciclo para escanear y eliminar entonces – miguel

1

estoy seguro de que con un poco más de tiempo que puede llegar a wiht algo mejor, pero esto le dará una buena idea:

public string NumberOrLetterOnly(string s) 
{ 
    string rtn = s; 
    for (int i = 0; i < s.Length; i++) 
    { 
     if (!char.IsLetterOrDigit(rtn[i]) && rtn[i] != '-') 
     { 
      rtn = rtn.Replace(rtn[i].ToString(), " "); 
     } 
    } 
    return rtn.Replace(" ", ""); 
} 
+0

Oh, acabo de notar que no quería bucles. Además, la solución de expresiones regulares se ve mejor de todos modos. No borraré mi publicación, porque algunos de esos métodos aún pueden ser útiles – Joel

3

Pruebe lo siguiente

public bool isStringValid(string input) { 
    if (null == input) { 
    throw new ArgumentNullException("input"); 
    } 
    return System.Text.RegularExpressions.Regex.IsMatch(input, "^[A-Za-z0-9\-]*$"); 
} 
+0

O puede hacer esto: return Regex.Replace (input ?? string.Empty, @ "[^ A-z0-9 \ - ] "," "); – Joel

+0

+1 para incluir el alcance completo –

13

He aquí una forma divertida de hacerlo con LINQ - no hay lazos feos, sin RegEx complicada:

private string GetGoodString(string input) 
{ 
    var allowedChars = 
     Enumerable.Range('0', 10).Concat(
     Enumerable.Range('A', 26)).Concat(
     Enumerable.Range('a', 26)).Concat(
     Enumerable.Range('-', 1)); 

    var goodChars = input.Where(c => allowedChars.Contains(c)); 
    return new string(goodChars.ToArray()); 
} 

alimentarlo "Hola, mundo 123?!" y devolverá "Helloworld123".

+2

Debo decir que me gusta esto, ¡solo porque está evitando RegExes =) +1! –