2013-05-28 33 views
7

Tôi có cụm từ thông dụng rằng tôi đang cố gắng tìm ra mô hình Xác thực Chú thích Dữ liệu .NET mà tôi đang sử dụng. Hiện tại, có vẻ như đây là.NET regex cụ thể đối với .net C# dataannotations

[RegularExpression("^((?!City)[a-zA-Z '])+$", ErrorMessage = "City is required and must be properly formatted.")] 

Nửa đầu của quy trình này là để tính đến Thành phố, nửa thứ hai là đảm bảo chỉ có chữ cái và khoảng trắng.

Giá trị mặc định cho hộp văn bản đầu vào là Thành phố, do đó, chỉ cần "Thành phố" không thể vượt qua xác thực. Tôi dường như không thể lấy phần đầu tiên của regex đó để có những trường hợp này.

Cityville 
City City 
Jersey City 
Arizona City 

Nhưng trường hợp này không vượt qua:

City 

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều.

* EDIT * Cái này đã làm các trick:

^(?! (^ Thành phố $) [a-zA-Z ']) + $

tôi cập nhật tất cả các xác nhận của tôi để bao gồm điều này. Chỉ trong trường hợp bạn muốn xem những gì tôi đang làm. Ở đây nếu mã cho toàn bộ mô hình dữ liệu xác nhận mà tôi đang sử dụng. (được cập nhật với đúng regex)

public class FormModel { 
    [Required(ErrorMessage = "First Name is a Required field.")] 
    [DataType(DataType.Text)] 
    [Display(Order = 1, Name = "FirstName")] 
    [RegularExpression("^((?!^First Name$)[a-zA-Z '])+$", ErrorMessage = "First name is required and must be properly formatted.")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Last Name is a Required field.")] 
    [DataType(DataType.Text)] 
    [Display(Order = 2, Name = "LastName")] 
    [RegularExpression("^((?!^Last Name$)[a-zA-Z '])+$", ErrorMessage = "Last name is required and must be properly formatted.")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage = "Address is a Required field.")] 
    [DataType(DataType.Text)] 
    [Display(Order = 3, Name = "Address")] 
    [RegularExpression("^((?!^Address$)[0-9A-Za-z #.,])+$", ErrorMessage = "Address is required and must be properly formatted.")] 
    public string Address { get; set; } 

    [DataType(DataType.Text)] 
    [Display(Order = 4, Name = "Address2")] 
    public string Address2 { get; set; } 

    [Required(ErrorMessage = "City is a Required field.")] 
    [DataType(DataType.Text)] 
    [RegularExpression("^((?!^City$)[a-zA-Z '])+$", ErrorMessage = "City is required and must be properly formatted.")] 
    [Display(Order = 6, Name = "City")] 
    public string City { get; set; } 

    [Required(ErrorMessage = "State is a Required field.")] 
[DataType(DataType.Text)] 
[Display(Order = 7, Name = "State")] 
public IEnumerable<String> State { get; set; } 

[Required(ErrorMessage = "Zip is a Required field.")] 
[DataType(DataType.Text)] 
[RegularExpression("\\d{5}", 
     ErrorMessage = "Zip Code is required and must be properly formatted.")] 
[Display(Order = 8, Name = "Zip")] 
public String Zip { get; set; } 

[Required(ErrorMessage = "Phone is a Required field.")] 
[DataType(DataType.PhoneNumber)] 
[RegularExpression("^[01]?[- .]?\\(?[2-9]\\d{2}\\)?[- .]?\\d{3}[- .]?\\d{4}$", 
     ErrorMessage = "Phone is required and must be properly formatted.")] 
[Display(Order = 9, Name = "Phone")] 
public string Phone { get; set; } 

[Required(ErrorMessage = "Email is a Required field.")] 
[DataType(DataType.EmailAddress)] 

[RegularExpression("^[A-Za-z0-9._%+-]*@[A-Za-z0-9.-]*\\.[A-Za-z0-9-]{2,}$", 
     ErrorMessage = "Email is required and must be properly formatted.")] 
[Display(Order = 10, Name = "Email")] 
public string Email { get; set; } 

Trả lời

2

Hãy thử điều này ra cho các biểu thức chính quy - ^((?!^City$)[a-zA-Z '])+$
Để làm một kiểm tra tiêu cực đối với "Thành phố", tôi đã thêm một sự khởi đầu (^) ký tự & cuối ($) đến Thành phố. Tôi đã thử nghiệm nó tại http://regex101.com/r/bF4bZ3 và có vẻ như nó hoạt động nếu tôi hiểu đúng yêu cầu.

+0

Điều đó đã làm được điều đó! Cảm ơn –

+0

@ChrisLimina Bạn nên đánh dấu phần này là câu trả lời được chấp nhận nếu nó giải quyết được sự cố của bạn. – melwil

1

Đây thực sự là một sai lầm rất nhỏ về phía bạn. Thay đổi Regex của bạn thành:

^(?!^City$)[a-zA-Z ']+$ 

Và bạn sẽ có hiệu quả mong muốn. Về cơ bản, + có nghĩa là một hoặc nhiều lần, và vì bạn có biểu thức WHOLE được đặt trong dấu ngoặc đơn sẽ xuất hiện một hoặc nhiều lần, nó sẽ tìm thấy kết quả "Thành phố" tại bất kỳ điểm nào trong chuỗi ... Thay vào đó, Tiếng Anh: Không phải là "Thành phố", và các chữ cái và dấu cách hoặc dấu nháy đơn một hoặc nhiều lần.

Một công cụ tốt để kiểm tra Regex là Regex Hero: http://regexhero.net/tester

+1

Địa chỉ này không khớp với 'Thành phố Thành phố'. Bạn cần một '$' trong giao diện trước để đảm bảo không có gì sau Thành phố. – juharr

+0

Bạn nói đúng. Đã sửa đổi. – Haney

1

(?!City) nghĩa City có độ rộng bằng lookahead Negative, vì vậy, ^((?!City)[a-zA-Z '])+$ có nghĩa là:

  • Chỉ chứa chữ không gian và '
  • Không chứa City

Dưới đây là cách không cho phép City:

//Regular Expression  
//^(?!^\s*City\s*$)[a-zA-Z ']+$ 
//as a .Net string 
string str = "^(?!^\\s*City\\s*$)[a-zA-Z ']+$" 

Demo

1

Đối sánh tiêu cực trong cụm từ thông dụng thường là ý tưởng tồi, nó không được thiết kế theo cách đó. Phương pháp tốt nhất là kiểm tra:

"^City$" 

Và phủ nhận thử nghiệm. Trong trường hợp này bạn không thực sự có một tùy chọn để làm điều đó.

Bạn đang thực sự gần gũi, bạn chỉ cần di chuyển neo của bạn vào lookahead tiêu cực, và cung cấp cho chuỗi một chiều dài min.

(?!^City$)[-a-zA-Z ]{4,} 

Điều này sẽ khớp với bất kỳ thứ gì có 4 ký tự trở lên không phải là "Thành phố".

Nếu không có độ dài min "ity" trong "Thành phố" sẽ là kết quả phù hợp sẽ không giúp bạn.

Bạn có thể giảm độ dài tối thiểu xuống 3 bằng cách thêm giao diện phía sau nếu bạn muốn.

(?!^City$)[-a-zA-Z ]{3,}(?<!^City$) 
1

Câu trả lời khác đã giúp bạn với biểu thức chính quy mà bạn đã yêu cầu. Tôi sẽ bình luận về một khía cạnh hơi khác - giá trị mặc định phải là một cái gì đó có ý nghĩa, hoặc không có gì cả ("Thành phố" là một giá trị mặc định xấu).

Điều bạn có thể muốn làm là đặt văn bản giữ chỗ, văn bản này sẽ biến mất ngay sau khi bạn nhập hộp văn bản. Bạn có thể làm điều này với thuộc tính Prompt thuộc tính Display nếu bạn đang sử dụng NET 4.5 - xem this answer để biết chi tiết.

Không sử dụng giá trị mặc định giả nghĩa là bạn chỉ có thể sử dụng [Required] và người dùng sẽ cần nhập nội dung nào đó và dừng bạn cần theo dõi giá trị mặc định giả của bạn.

Chỉ cần ném một cờ lê khác trong công trình, "Thành phố" là valid place name - có hai làng được gọi là Thành phố ở xứ Wales và một khu vực ở Zurich!

+0

Nếu tôi đã có nó theo cách của tôi tôi sẽ chỉ sử dụng nhãn cho tất cả mọi thứ. tiếc là sáng tạo thích để đi lên với các hình thức mà mess lên xác nhận biểu mẫu của tôi. Những gì tôi sẽ làm cuối cùng là cố gắng sử dụng điều này như là một thay thế cho chú thích dữ liệu .NET. http://fluentvalidation.codeplex.com/ –

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