如何否定邮政信箱 - 正则表达式

Ric*_*cka 4 c# regex street-address

我已经尝试了几件事,但无法使其正常工作。我需要排除邮政信箱。我以为我只需要用 ?!.. 包裹它,但它不起作用。有什么想法吗?

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

编辑:对不起,这就是我要找的。

示例:当输入是“邮政信箱”或“邮局”时,我需要正则表达式为假。当输入为 7821 Test street 时,我需要正则表达式为真。

我试图在 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" };
 }
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

ste*_*ema 7

你的正则表达式有很多问题,我试着一个接一个地解决

  1. 在 Character 类中,您不需要 a|作为 OR。里面的每个字符都被添加到允许的字符列表中。所以做 a[P|p]允许三个字符“P”、“p”和“|”。

    正确的类是 [Pp]

  2. 您使用内联修饰符(?i)。这使得以下所有匹配的字母都独立于大小写。所以[Pp]是不必要的,只要p匹配字母“P”和“p”就足够了。

    包括前两个问题,我们可以将您的表达更改为

     ^(?!(?i)p*(ost)*\.*\s*[Oo0]*(ffice)*\.*\s*b[o0]x\s*(\d.)*)$
    
    Run Code Online (Sandbox Code Playgroud)
  3. 除了b[o0]x通过*量词可重复 0 次或多次之外,您已经完成了所有操作。我很确定这不是您想要的,还是您想找到“pppppppostpostb0x”之类的东西?

错误的正则表达式,当输入是“PO BOX”或“Post Office”时更像是这样:

^(?i)(?!p\.?o\.?\sbox|post\soffice).*$
Run Code Online (Sandbox Code Playgroud)

这个正则表达式将匹配每个字符串(因为.*在末尾),除了像这样开头的字符串:

  • 邮政信箱
  • 邮政信箱
  • 邮政信箱
  • 邮局
  • 邮局