【问题标题】:Real address giving PO BOX error because of having the phrase "box" in it真实地址给出 PO BOX 错误,因为其中包含短语“box”
【发布时间】:2021-11-17 23:25:48
【问题描述】:

我正在使用一种旨在阻止邮政信箱的验证方法。正如所写的,它目前阻止像“42 Boxwood Ln”这样的真实地址,因为“Box”这个短语。我该如何解决这个问题 - 可能只阻止似乎是邮政信箱的较短字符串?例如,确保字符串“Box”后面必须跟一个数字?

这是当前代码:

private static bool IsPostOfficeBox(string add1, string add2)
{
    if (add1 == null) return false;
        
    var poBoxReg = new Regex(@"(?i)\b(?:p(?:ost)?\.?\s*[o0](?:ffice)?\.?\s*b(?:[o0]x)?|b[o0]x)");

    var isPOBox = poBoxReg.IsMatch(add1);
    if (add2 == null || isPOBox) return isPOBox;

    return poBoxReg.IsMatch(add2);
}

【问题讨论】:

  • 你要我们做什么?
  • 此正则表达式使用户传递的任何地址都失败,并且其中包含单词“box”。它将其视为邮政信箱号码而不是地址并给出错误。
  • 所以您想要一个查找“框后跟至少一个数字”的正则表达式?
  • 是的,这就是我要找的
  • 当 add1 作为“42 Boxwood Ln”传入并且 add2 作为“Apt 111”传入时。我正在寻找的是“isPOBox”以“假”的形式出现,而现在它以“真”的形式出现。

标签: c# regex


【解决方案1】:

有两种选择:

  • 匹配 后跟数字 - box\s\d
  • 匹配单词边界,即 box 但不匹配 boxwood - \bbox\b

使用这两个来匹配“PO Box 1242”而不是“42 Boxwood Ln”。 See example(注意 RegexOptions.IgnoreCase 匹配不区分大小写)。

【讨论】:

  • 在 Google 地图上的快速搜索向我证实,例如在英国有很多 Box Lane。主要是因为它也可以是灌木的名称。所以你不能假设单词边界是标记邮政信箱的可靠方法。
  • 小提琴同时显示两个规则,即\bbox\b\s\d,它不应该匹配“Box Lane”,因为“Box”后面没有数字
  • 啊,您的回答更像是“其中任何一个都可以”,而不是“同时使用这两个”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多