2009-07-20 39 views
5

Tôi đang cố viết một chuỗi biểu thức chính quy khớp trong vb.net. Điều kiện mà tôi đang cố triển khai là chuỗi chỉ chứa các bảng chữ cái và phải chứa ít nhất một chữ cái của cả chữ hoa và chữ thường. tức là thất bại AAA, aaa-fail, aAaA-pass.Cụm từ thông dụng để khớp với chuỗi chữ cái và yêu cầu ít nhất một chữ hoa và một chữ thường (vb.net)

Các biểu hiện thường xuyên mà tôi đã đưa ra là ^(([a-z]+[A-Z]+)+|([A-Z]+[a-z]+)+)$

Ai đó có thể đề xuất một số tốt hơn/đơn giản biểu thức chính quy cho cùng?

+0

nếu tôi muốn khái quát hóa nó nhiều hơn một chút, như bây giờ tôi muốn một chuỗi có az AZ, 0-9 và! @ # $ .. và nó phải có tất cả bốn và không có nhân vật khác. Tôi có cần phải gõ vào tất cả hoán vị trong regex không? – Shailendra

Trả lời

4

Regex bạn tạo sẽ thất bại trong một số điều kiện, chẳng hạn như "aAb". Tôi nghĩ rằng những điều sau sẽ hoạt động tốt hơn cho bạn:

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

Không, nó sẽ không thất bại trên 'aAb'. Tôi đề nghị bạn thử chạy nó. – RaYell

+0

Nhận xét của tôi liên quan đến regex gốc của Shail, không phải của bạn. Giải pháp của bạn là chính xác. – Templar

+0

Ồ, xin lỗi sau đó. Tôi nhận thấy nó đã được thêm vài phút sau khi tôi vì vậy tôi nghĩ bạn đang đề cập đến nó. – RaYell

4

RegEx này sẽ làm việc cho bạn:

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

Giải thích: nếu chuỗi phải có ít nhất một chữ thường và một chữ cái viết hoa có một điểm mà chữ hoa và chữ thường là bên cạnh nhau. Nơi này được kết hợp bởi ([AZ] [az] | [az] [AZ]) và nó khớp với cả hai trường hợp: một trong đó char chữ hoa đầu tiên và vị trí thứ hai, sau đó nếu bạn đáp ứng tiêu chí này, bạn có thể thêm tùy ý số chữ thường của ký tự chữ hoa ở bất kỳ đầu nào của chuỗi và nó vẫn sẽ khớp với

1

Chỉ để cho vui, tôi đã cố gắng giải quyết vấn đề của bạn mà không sử dụng cụm từ thông dụng.

tôi có phương pháp sau đó kiểm tra nếu một giá trị chuỗi chứa các ký tự tương ứng với loại unicode quy định (chữ hoa, chữ thường, chữ số ...)

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 

Phương pháp này có thể được sử dụng theo cách này:

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

Sử dụng phương pháp này, bạn có thể cho phép ký tự chữ hoa, chữ thường và chữ số mà không thay đổi bất kỳ thứ gì. Chỉ cần thêm đối số thứ ba vào IsValid: UnicodeCategory.DecimalDigitNumber

Các vấn đề liên quan