Sólo por diversión, he intentado hacer frente a su problema sin el uso de expresiones regulares.
tengo el siguiente método que comprueba si un valor de cadena contiene caracteres que corresponden a las categorías de Unicode especificado (mayúsculas, minúsculas, dígitos ...)
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
El método puede ser utilizado de esta manera:
Dim myString As String = "aAbbC"
Dim validString As Boolean = IsValid(myString, _
UnicodeCategory.LowercaseLetter, _
UnicodeCategory.UppercaseLetter)
Al usar este método, puede permitir caracteres en mayúsculas, minúsculas y dígitos sin cambiar nada. Simplemente agregue un tercer argumento a IsValid: UnicodeCategory.DecimalDigitNumber
¿Qué sucede si quiero generalizarlo un poco más, como en decir ahora quiero una cadena que debe tener az AZ, 0-9 y! @ # $ .. y debe tener los cuatro y ningún otro personaje. ¿Debo escribir toda la permutación en la expresión regular? – Shailendra