2013-05-28 39 views
7

我有一個正則表達式,我試圖找出一個.NET數據註釋驗證模型,我正在使用。目前看起來像這樣.NET正則表達式特定於.net C#dataannotations

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

這個正則表達式的前半部分是占城市,下半部分是確保其唯一的字母和空格。

輸入文本框的默認值是城市,所以只是「城市」不能通過驗證。我似乎無法讓這個正則表達式的第一部分通過這些情況。

Cityville 
City City 
Jersey City 
Arizona City 

但這種情況下,不通過:

City 

任何幫助將不勝感激。

* 編輯 * 這其中的伎倆:

^(?!(^市$)[A-ZA-Z「])+ $

我更新了所有的我的驗證包括這一點。以防萬一你想看看我在做什麼。在這裏,如果我使用的整個驗證數據模型的代碼。 (用正確的正則表達式更新)

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; } 

回答

2

嘗試了這一點正則表達式 - ^((?!^City$)[a-zA-Z '])+$
要爲 「城市」 做了否定的檢查,我添加了一個開始(^)&末($)字符到城市。 我已經在http://regex101.com/r/bF4bZ3上測試過了,如果我正確理解了這個要求,它似乎就可以工作。

+0

這個伎倆!謝謝 –

+0

@ChrisLimina如果它解決了您的問題,您應該將其標記爲已接受的答案。 – melwil

1

這其實是一個非常小的錯誤。將您的正則表達式更改爲:

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

而且您將獲得理想的效果。基本上,+意味着一次或多次,並且由於您將括號內的WHOLE表達式包含在一次或多次出現的括號內,因此它會在字符串中的任意位置找到「城市」匹配項......而不是說在英文:不是「城市」,字母和空格或單引號一次或多次。

一個很好的工具來測試正則表達式是正則表達式英雄:http://regexhero.net/tester

+1

這不符合'城市城市'。你需要一個'$'來確保城市之後沒有任何東西。 – juharr

+0

你說得對。改性。 – Haney

1

(?!City)意味着City零寬度負先行,因此,^((?!City)[a-zA-Z '])+$表示:

  • 只包含字母空格和「
  • 不含City

以下是如何禁止City

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

Demo

1

在正則表達式中的負面匹配通常是一個壞主意,它只是沒有這樣設計。最好的方法是覈對:

"^City$" 

而且否定了測試。在這種情況下,你並沒有真正的選擇。

你真的很接近,你只需要將你的錨點移動到負向預覽中,然後給這個字符串一個最小長度。

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

這將匹配4個或更多不是「城市」的任何東西。

沒有最小長度的「城市」中的「性」將是一場無法幫助你的比賽。

如果您願意,可以通過添加後面的內容來縮短最小長度爲3。

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

其他答案給了你所要求的正則表達式的幫助。我要對一個稍微不同的方面發表評論 - 默認值應該是有意義的,或者什麼都沒有(「城市」是一個不好的默認值)。

您可能想要做的是放置佔位符文本,只要您輸入文本框就會消失。如果您使用NET 4.5,則可以使用屬性Display屬性執行此操作 - 有關詳細信息,請參見this answer

不使用虛假的默認值意味着您可以只使用[Required],用戶需要輸入內容並停止記錄您的假默認值。

只是要在作品中扔另一個扳手,「城市」是一個valid place name - 有兩個村莊叫威爾士城市和蘇黎世一個地區!

+0

如果我有我的方式,我會只使用標籤的一切。不幸的是,創意喜歡想出讓表單驗證混亂的表單。我最終會做的是嘗試使用它作爲.NET數據註釋的替代品。 http://fluentvalidation.codeplex.com/ –