2013-05-28 12 views
7

私が使用している.NET Data Annotation Validationモデルについて把握しようとしている正規表現があります。現在は次のようになっています.NET正規表現.net C#dataannotations

この正規表現の最初の半分はCityを説明するためのもので、後半は唯一の文字とスペースです。

入力テキストボックスのデフォルト値は「City」なので、「City」は検証をパスできません。私は、正規表現の最初のセクションでこれらのケースを通過させることができないようです。

Cityville 
City City 
Jersey City 
Arizona City 

しかし、この場合は合格しない:

City 

任意の助けいただければ幸いです。

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

私はすべてを更新:

* EDIT * この1つはトリックをしましたこれを含める私の妥当性検査。あなたが何をしているのかを見たい場合に備えて。ここでは、私が使用している検証データモデル全体のコードです。 (正しい正規表現で更新されました)

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 ']+$ 

そして、あなたは望ましい効果があります。基本的に+は1回以上を意味し、WHOLE式が1つ以上現れる大括弧で囲まれているため、文字列の任意のポイントで "City"の一致が検出されます...英語:「都市」ではなく、文字とスペースまたは一重引用符を1回以上使用します。

正規表現をテストするための良いツールは、正規表現のヒーローです:http://regexhero.net/tester

+1

これは 'City City'と一致しません。 Cityの後ろに何もないことを確認するために、前方に '$'が必要です。 – 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,} 

"City"以外の4文字以上のものと一致します。

「City」の「ity」は最小の長さがなければ、あなたには役に立たないでしょう。

あなたが好きな場合は、背後に追加することで、最小長を3に減らすことができます。

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

他の回答から、あなたが要求した正規表現のヘルプが表示されています。私は少し違う点についてコメントします - デフォルト値は何か意味のあるものでなければなりません。まったく意味がありません( "City"はデフォルト値が悪い)。

あなたがしたかったのは、テキストボックスに入るとすぐに消えるプレースホルダテキストでした。 NET 4.5を使用している場合はPromptという属性(Display属性)で行うことができます - 詳しくはthis answerを参照してください。

偽のデフォルト値を使用しない場合は、[Required]を使用することができ、ユーザは何かを入力する必要があり、偽のデフォルト値が何であるかを把握する必要がなくなります。

「City」はvalid place nameです。City in Walesとチューリッヒの2つの村があります。

+0

もし私が私のやり方を持っていれば、私はすべてのものにラベルを使用するだけです。残念ながら創造的なことは、私のフォーム検証を台無しにするフォームを思い付くのが好きです。私が最終的にやることは、これを.NETデータ注釈の代替として使用することです。 http://fluentvalidation.codeplex.com/ –