2009-07-20 7 views
5

J'essaie d'écrire une correspondance de chaîne d'expression régulière dans vb.net. La condition que j'essaye de mettre en application est que la chaîne devrait contenir seulement des alphabets et doit contenir au moins une lettre des deux majuscules et minuscules. c'est-à-dire AAA-fail, aaa-fail, aAaA-pass.Expression régulière correspondant à une chaîne alphabétique et nécessitant au moins une majuscule et une minuscule (vb.net)

L'expression régulière que je suis venu avec est ^(([a-z]+[A-Z]+)+|([A-Z]+[a-z]+)+)$

Quelqu'un peut-il suggérer une meilleure/expression régulière plus simple pour la même chose?

+0

et si je veux généraliser un peu plus, comme disons maintenant je veux une chaîne qui devrait avoir az AZ, 0-9 et! @ # $ .. et il doit avoir tous les quatre et aucun autre caractère. Ai-je besoin de taper toutes les permutations dans la regex? – Shailendra

Répondre

4

La regex que vous avez créée échouera dans certaines conditions, telles que "aAb". Je pense que ce qui suit fonctionnera mieux pour vous:

^(?:[a-z]+[A-Z]+|[A-Z]+[a-z]+)(?:[a-zA-Z])*$ 
+0

Non, il n'échouera pas sur 'aAb'. Je vous suggère de l'essayer. – RaYell

+0

Mon commentaire concernait l'expression rationnelle originale de Shail, pas la vôtre. Votre solution est correcte – Templar

+0

Oh, désolé alors. J'ai remarqué qu'il a été ajouté quelques minutes après le mien alors je pensais que vous vous y référez. – RaYell

4

Cette RegEx travaillera pour vous:

^[a-zA-Z]*([A-Z][a-z]|[a-z][A-Z])[a-zA-Z]*$ 

Explication: si la chaîne doit avoir au moins une minuscule et une lettre majuscule il y a un point où les lettres majuscules et minuscules sont à côté de l'autre. Ce lieu est apparié par ([AZ] [az] | [az] [AZ]) et il correspond aux deux cas: un où la majuscule est premier et où il est deuxième, puis si vous avez rencontré ce critère, vous pourriez ajouter un nombre arbitraire de majuscules de minuscules à n'importe quelle extrémité de la chaîne et il correspondra toujours

1

Juste pour le plaisir, j'ai essayé de résoudre votre problème sans utiliser d'expressions régulières.

I ont la méthode suivante qui vérifie si une valeur de chaîne contient des caractères qui correspondent à des catégories d'Unicode spécifié (majuscules, minuscules, chiffres ...)

Private Function IsValid(ByVal value As String, _ 
         ByVal ParamArray categories As UnicodeCategory()) _ 
         As Boolean 

    'Create a hashset with valid unicode categories 
    Dim validSet = New HashSet(Of UnicodeCategory)(categories) 

    'Group the string value's characters by unicode category 
    Dim groupedCharacters = value.GroupBy(Function(c) Char.GetUnicodeCategory(c)) 

    'Get an enumerable of categories contained in the string value 
    Dim actualCategories = groupedCharacters.Select(Function(group) group.Key) 

    'Return true if the actual categories correspond 
    'to the array of valid categories 
    Return validSet.SetEquals(actualCategories) 
End Function 

Le procédé peut être utilisé de cette façon:

Dim myString As String = "aAbbC" 
Dim validString As Boolean = IsValid(myString, _ 
            UnicodeCategory.LowercaseLetter, _ 
            UnicodeCategory.UppercaseLetter) 

En utilisant cette méthode, vous pouvez autoriser des majuscules, des minuscules et des chiffres sans rien changer. Juste ajouter un troisième argument à IsValid: UnicodeCategory.DecimalDigitNumber

Questions connexes