2010-11-18 5 views
19

Tôi có một chuỗi mà tôi sử dụng để xác nhận phía khách hàng:RegularExpressionAttribute - Làm thế nào để làm cho nó không phân biệt chữ hoa chữ thường để xác thực phía khách hàng?

private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$"; 

tôi sử dụng chuỗi này trong thuộc tính [RegularExpression(regex, ErrorMessage = "invalid")] tôi.

Tôi biết rằng cờ /i cho một regex Javascript được sử dụng để làm cho nó không phân biệt chữ hoa, nhưng chỉ cần gắn nó vào cuối regex của tôi (tức là @"^....$/i" không hoạt động. được nhập (có giá trị hay không).

tôi đang thiếu gì?

Trả lời

7
private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([a-zA-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$"; 
+4

ah! tất nhiên! câu trả lời tuyệt vời - tuy nhiên, tôi phải hỏi: có cách nào để sử dụng cờ không phân biệt chữ hoa chữ thường không? –

+1

Regex re = new Regex (@ "^ (?: \ B (?: \ D {5} (?: \ S * - \ s * \ d {5})? | ([A-zA-Z] { 2}) \ d {3} (?: \ S * - \ s * \ 1 \ d {3})?) (?:, \ S *)?) + $ ", RegexOptions.IgnoreCase); // Đó là mã C#. –

+0

câu hỏi có liên quan đến RegularExpressionAttribute và ở đó bạn phải vượt qua chỉ chuỗi. Vì vậy, bạn không thể sử dụng lớp Regex với các thuộc tính –

15

trong C# bạn có thể inline một số tùy chọn regex. để xác định các tùy chọn để bỏ qua trường hợp bạn sẽ thêm (?i) đến đầu mô hình của bạn Tuy nhiên, tôi không chắc làm thế nào điều này sẽ được điều trị bởi các RegularExpressionAttribute và nếu nó xử lý bản dịch cho phía máy khách. Từ kinh nghiệm của tôi với ASP.NET RegularExpressionValidator Tôi nghi ngờ nó; regex phải là vanilla đủ để hoạt động cho cả hai động cơ.

Trong mọi trường hợp nếu nó là hợp lệ nó sẽ trông như thế này:

@"^(?i)(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$" 
+2

Nó hoạt động cho ASP.NET MVC 2 ít nhất. Nhưng chỉ phía máy chủ. –

29

Tôi tạo ra thuộc tính này cho phép bạn chỉ định RegexOptions. EDIT: Nó cũng tích hợp với xác nhận không phô trương. Khách hàng sẽ chỉ tuân theo RegexOptions.Multiline và RegexOptions.IgnoreCase vì đó là những gì JavaScript hỗ trợ.

[RegularExpressionWithOptions(@"[email protected]\.com", RegexOptions = RegexOptions.IgnoreCase)] 

C#

public class RegularExpressionWithOptionsAttribute : RegularExpressionAttribute, IClientValidatable 
{ 
    public RegularExpressionWithOptionsAttribute(string pattern) : base(pattern) { } 

    public RegexOptions RegexOptions { get; set; } 

    public override bool IsValid(object value) 
    { 
     if (string.IsNullOrEmpty(value as string)) 
      return true; 

     return Regex.IsMatch(value as string, "^" + Pattern + "$", RegexOptions); 
    } 

    public IEnumerable<System.Web.Mvc.ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = FormatErrorMessage(metadata.DisplayName), 
      ValidationType = "regexwithoptions" 
     }; 

     rule.ValidationParameters["pattern"] = Pattern; 

     string flags = ""; 
     if ((RegexOptions & RegexOptions.Multiline) == RegexOptions.Multiline) 
      flags += "m"; 
     if ((RegexOptions & RegexOptions.IgnoreCase) == RegexOptions.IgnoreCase) 
      flags += "i"; 
     rule.ValidationParameters["flags"] = flags; 

     yield return rule; 
    } 
} 

Javascript

(function ($) { 

    $.validator.unobtrusive.adapters.add("regexwithoptions", ["pattern", "flags"], function (options) { 
     options.messages['regexwithoptions'] = options.message; 
     options.rules['regexwithoptions'] = options.params; 
    }); 

    $.validator.addMethod("regexwithoptions", function (value, element, params) { 
     var match; 
     if (this.optional(element)) { 
      return true; 
     } 

     var reg = new RegExp(params.pattern, params.flags); 
     match = reg.exec(value); 
     return (match && (match.index === 0) && (match[0].length === value.length)); 
    }); 

})(jQuery); 

Bài viết này bởi Anthony Stevens đã giúp tôi làm việc này: ASP.NET MVC 3 Unobtrusive Javascript Validation With Custom Validators

+0

Tôi chưa thử nghiệm giải pháp của bạn nhưng tôi biết cách tiếp cận chung hoạt động vì nó đã giải quyết được vấn đề tương tự ở đây: http://stackoverflow.com/questions/5937174/how-can-i-ignore-case-in-a-regularexpression – Sean