Ради интереса я попытался решить вашу проблему без использования регулярных выражений.
У меня есть следующий метод, который проверяет, содержит ли строковое значение символы, соответствующие указанным категориям Юникода (прописные, строчные, цифры ...)
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
Метод можно использовать так:
Dim myString As String = "aAbbC"
Dim validString As Boolean = IsValid(myString, _
UnicodeCategory.LowercaseLetter, _
UnicodeCategory.UppercaseLetter)
Используя этот метод, вы можете разрешить ввод символов в верхнем и нижнем регистре и цифр без каких-либо изменений. Просто добавьте третий аргумент в IsValid: UnicodeCategory.DecimalDigitNumber