4

私はいくつかのことを試しましたが、それを機能させることができませんでした。私書箱を除外する必要があります。?! でラップする必要があると思っていましたが、機能していません。何かご意見は?

^((?i)[P|p]*(OST|ost)*\.*\s*[O|o|0]*(ffice|FFICE)*\.*\s*[B|b][O|o|0][X|x]\s*(\d.))*$

編集:申し訳ありませんが、これは私が探しているものです。

例: 入力が「PO BOX」または「Post Office」の場合、正規表現を false にする必要があります。入力が 7821 テスト通りの場合、正規表現が true である必要があります。

ASP.net MVC プロジェクトで使用しようとしています

/// <summary>
/// Regex for street fields
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple =     false)]
public class StreetAddressAttribute : RegularExpressionAttribute, IClientValidatable
{
/// <summary>
/// Regular expression validation for street field
/// </summary>
public StreetAddressAttribute()
  : base(@"^(?!(?i)[P|p]*(OST|ost)*\.*\s*[O|o|0]*(ffice|FFICE)*\.*\s*[B|b][O|o|0][X|x]\s*(\d.)*)$")
{
}

 /// <summary>
 /// Client side validation
 /// </summary>
 /// <param name="metadata">Modelmetadata</param>
 /// <param name="context">ControllerContext</param>
 /// <returns>Client-side validation rules</returns>
 public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata    metadata, ControllerContext context)
 {
   yield return new ModelClientValidationRule { ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "streetaddress" };
 }
}

ご協力いただきありがとうございます

4

1 に答える 1

7

あなたの正規表現には非常に多くの問題があります。私は次々に対処しようとします

  1. |Character クラスでは、OR としてa は必要ありません。内部のすべての文字は、許可された文字リストに追加されます。したがって、a を実行[P|p]すると、「P」、「p」、および「|」の 3 文字が許可されます。

    正しいクラスは[Pp]

  2. インライン修飾子を使用します(?i)。これにより、次の文字がすべて一致し、大文字と小文字が区別されなくなります。そう[Pp]は不要でp、文字「P」と「p」を一致させるだけで十分です。

    この最初の 2 つの問題を含めて、表現を次のように変更できます。

     ^(?!(?i)p*(ost)*\.*\s*[Oo0]*(ffice)*\.*\s*b[o0]x\s*(\d.)*)$
    
  3. b[o0]x量指定子によって 0 回以上の反復可能以外のすべてを作成しました*。これはあなたが望んでいるものではないと確信していますか、それとも「pppppppostostb0x」のようなものを見つけたいですか?

入力が「PO BOX」または「Post Office」の場合に偽となる正規表現は、次のようになります。

^(?i)(?!p\.?o\.?\sbox|post\soffice).*$

この正規表現は、次のように始まる.*文字列を除いて、すべての文字列に一致します (末尾に があるため) 。

  • 私書箱
  • 私書箱
  • 私書箱
  • 郵便局
  • 郵便局
于 2013-05-23T20:24:57.627 に答える