10

私が使用している.NET Data Annotation Validationモデルのために理解しようとしている正規表現があります。現在はこんな感じ

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

この正規表現の前半は City を説明するためのもので、後半は文字とスペースのみを確認するためのものです。

入力テキスト ボックスのデフォルト値は City であるため、"City" だけでは検証に合格できません。その正規表現の最初のセクションでこれらのケースを通過させることができないようです。

Cityville  
City City
Jersey City
Arizona City

しかし、このケースはパスしません:

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

5 に答える 5

4

正規表現でこれを試してみてください - ^((?!^City$)[a-zA-Z '])+$
「City」の否定的なチェックを行うために、City に開始 (^) と終了 ($) 文字を追加しました。http://regex101.com/r/bF4bZ3でテストしましたが、要件を正しく理解していれば機能するようです。

于 2013-05-28T16:09:54.287 に答える
1

正規表現でのネガティブ マッチングは、一般的に悪い考えです。そのように設計されていないだけです。最良の方法は、次のことを確認することです。

"^City$"

そして、テストを否定します。この場合、実際にそれを行うオプションはありません。

あなたは本当に近いです。アンカーを負の先読みに移動し、文字列に最小の長さを与えるだけです。

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

これは、"City" 以外の 4 文字以上のものに一致します。

最小の長さがないと、「City」の「ity」は役に立たない一致になります。

必要に応じて後ろ向きを追加することで、最小の長さを 3 に減らすことができます。

(?!^City$)[-a-zA-Z ]{3,}(?<!^City$)
于 2013-05-28T17:23:14.473 に答える
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 ']+$"

デモ

于 2013-05-28T16:06:51.883 に答える
0

これは実際には、あなたの小さな間違いです。正規表現を次のように変更します。

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

そして、あなたは望ましい効果を得るでしょう。基本的に + は 1 回以上を意味し、括弧で囲まれた WHOLE 式が 1 回以上発生するため、文字列内の任意の場所で "City" の一致が検出されます...代わりに、英語: "City" ではなく、文字とスペースまたは単一引用符が 1 回以上使用されています。

Regex をテストするための優れたツールは Regex Hero です: http://regexhero.net/tester

于 2013-05-28T16:02:18.187 に答える