【问题标题】:How to negate PO BOX - Regex如何否定 PO BOX - 正则表达式
【发布时间】:2013-05-23 19:54:21
【问题描述】:

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

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

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

示例:当输入为“邮政信箱”或“邮局”时,我需要正则表达式为假。当输入为 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" };
 }
}

感谢您的帮助

【问题讨论】:

  • 您能用现实世界的术语解释一下您希望匹配哪些可能的值吗?
  • 是否要排除所有邮政信箱甚至 APO 邮箱(海外美军)?
  • 我不会使用正则表达式(因为那只是添加一个新问题)。我认为一个更简单的“字符串包含'po box'、'p.o. box'、'post office box'等中的任何一个”效果更好。
  • 为什么不匹配邮政信箱然后否定返回值?
  • 我可以尝试重新思考整个事情。但是,我目前无法否定返回值,因为正则表达式只是作为属性发送到浏览器: data-val-regex-pattern="^(?!(?i)[P|p]*(OST| ost)*\.*\s*[O|o|0]*(办公室|FFICE)*\.*\s*[B|b][O|o|0][X|x]\s*( \d.)*)$"

标签: c# regex street-address


【解决方案1】:

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

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

    正确的类是[Pp]

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

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

     ^(?!(?i)p*(ost)*\.*\s*[Oo0]*(ffice)*\.*\s*b[o0]x\s*(\d.)*)$
    
  3. 除了b[o0]x 之外,您通过* 量词使所有内容都可重复0 次或多次。我很确定这不是您想要的,还是您想查找“pppppppostpostb0x”之类的内容?

输入为“P.O. BOX”或“Post Office”时为假的正则表达式更像这样:

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

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

  • 邮政信箱
  • 邮政信箱
  • p.o.盒子
  • 邮局
  • 办公室发布

【讨论】:

  • 感谢您清理我糟糕的正则表达式!
猜你喜欢
  • 1970-01-01
  • 2016-09-13
  • 2013-01-18
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多