【问题标题】:Testing for a PO Box in all of its forms测试所有形式的邮政信箱
【发布时间】:2011-03-10 18:21:03
【问题描述】:

我们有一个 C# ASP.Net 页面,客户在该页面中输入不允许邮局的地址,因为我们使用 UPS 运送这些物品。客户是有创造力的人,他们想出创造性的方法来标记 P.O.盒子。

我们有这个 RegEx 模式,它主要满足我们的需要。

(?i)\b[p]*(?:ost)*\.*\s*[o0]*(?:ffice)*\.*\s+?([b]*[o0]*[x])

这种模式几乎适用于我们存档的所有案例:

P.O. box 17432
poSt oFFice box 11111
box 222
p0 box 222
#343 po box 
#po box 343

不匹配(这是正确的行为):

1234 Main St (Shouldn't match, but we have it in there for a negative test case.)

但是,它也不匹配这些,它应该:

p0b 222
POB 1112

这些样本实际上是用户所拥有的价值,他们慷慨地向我们提供了这些价值。 ;)

我总是倾向于简化。

【问题讨论】:

  • 他们为什么要这样做?因为他们试图超越系统。当验证器被触发时,它会以大红色字母显示“没有邮政信箱”。作为记录,我们经常提醒客户,不允许使用邮政信箱。

标签: c# regex validation


【解决方案1】:

我认为这应该接近您正在寻找的内容:

(?i)\b(?:p(?:ost)?\.?\s*[o0](?:ffice)?\.?\s*b(?:[o0]x)?|b[o0]x)

解释:

(?:              # start non-capturing group
    p            # match a 'p'
    (?:ost)?     # optionally match 'ost'
    \.?          # optionally match a '.'
    \s*          # match some number of spaces
    [o0]         # match an 'o' or '0'
    (?:ffice)?   # optionally match 'ffice'
    \.?          # optionally match a '.'
    \s*          # match some number of spaces
    b(?:[o0]x)?  # match 'b', 'box', or 'b0x'
  |              # or
    b[o0]x       # match 'box' or 'b0x'
)

【讨论】:

  • 显然这个正则表达式会误报像“PSC 001 Box 001”这样的地址,这似乎是一个军事地址。
  • 我发现了一个轻微的例外,它影响了我们的系统,使用“POST BOX”的人,对我们来说,这个对正则表达式的轻微修复捕获了我们需要的东西(?i)\b(?:p(?:ost)?\.?\s*(?:[o0](?:ffice)?)?\.?\s*b(?:[o0]x)?|b[o0]x)(这里是一个demo )
猜你喜欢
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 2011-08-06
  • 2015-06-29
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
相关资源
最近更新 更多