2009-05-25 8 views
12

Je veux vous assurer une chaîne ne dispose que de caractères dans cette gammeFiltre une chaîne

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

donc toutes les lettres et les chiffres plus le trait d'union. J'ai essayé ...

C# App:

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

Ce TrimStart() ne semble fonctionner avec des lettres pas de caractères comme otehr $% etc

Est-ce que je mets en œuvre mal? Y a-t-il une meilleure façon de le faire?

Je veux juste éviter les boucles dans l'index de chaque chaîne de vérification car il y aura beaucoup de cordes à faire ...

pensées?

Merci!

+0

Vous devez vérifier que l'entrée est valide plutôt que ce qu'elle ne devrait pas prendre. Utilisez Regex pour vérifier votre chaîne. – David

Répondre

30

Cela semble être une raison parfaitement valable d'utiliser un regular expression.

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

En réponse au commentaire de miguel, vous pouvez le faire pour supprimer tous les caractères indésirables:

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

Notez que le caret (^) est maintenant placé intérieur la classe de caractères, annihilant ainsi (correspondant à tout caractère non autorisé).

+0

Un petit avertissement: Je viens de faire le motif de haut en haut de ma tête, donc ce n'est peut-être pas exactement ce que vous êtes après. Vous serez en mesure de trouver les informations dont vous avez besoin pour construire votre modèle idéal si vous suivez le lien. –

+0

je pense qu'il voulait supprimer tous les caractères qui étaient indésirables, cependant ... – miguel

+3

Vous devez mettre un symbole @ en face de la chaîne de sorte qu'il n'essaie pas d'échapper le -: Regex.Replace (s, @ "[^ A-z0-9 \ -] "," "); – Joel

1

Pourquoi ne pas simplement remplacer à la place? Trimstart ne supprimera que les caractères principaux de votre liste ...

+0

Parce qu'alors je dois avoir une tonne de déclarations de remplacement ... – Gabe

+0

il suffit d'écrire une boucle pour numériser et supprimer puis – miguel

1

Je suis sûr que, avec un peu plus de temps, vous pouvez trouver wiht quelque chose de mieux, mais cela vous donnera une bonne idée:

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, je viens de remarquer qu'il ne voulait pas de boucles. D'ailleurs la solution regex a l'air mieux quand même. Je ne vais pas supprimer mon message, car certaines de ces méthodes peuvent encore être utiles – Joel

3

Effectuez les opérations suivantes

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

Ou vous pouvez le faire: return Regex.Replace (input ?? string.Empty, @ "[^ A-z0-9 \ - ] "," "); – Joel

+0

+1 pour inclure la portée complète –

13

est ici un façon amusante de le faire avec LINQ - pas de boucles laid, pas RegEx compliqué:

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

ALIMENTE "Bonjour, monde 123?!" et il reviendra "Helloworld123".

+2

Je dois dire que j'aime ça, juste parce que vous évitez RegExes =) +1! –