1

我在这个网站上四处寻找一个好的 PO Box 正则表达式,但没有找到任何我喜欢或始终如一地工作的东西,所以我试着自己制作……我对此感觉很好,但我敢肯定SO上的好心人可以在其中戳一些洞:)那么...您对此有什么问题,您能想到哪些误报/误报可以解决?

我可以看到的一个警告是 PO Box 模式必须位于字符串的开头,但它还有什么问题?

public bool AddressContainsPOB(string Addr)
{
    string input = Addr.Trim().ToLower();
    bool Result = false;

    Regex regexObj1 = new Regex(@"^p(ost){0,1}(\.){0,1}(\s){0,2}o(ffice){0,1}(\.){0,1}((\s){1}|b{1}|[1-9]{1})");
    Regex regexObj2 = new Regex(@"^pob((\s){1}|[0-9]{1})");
    Regex regexObj3 = new Regex(@"^box((\s){1}|[0-9]{1})");

    Match match1 = regexObj1.Match(input);
    if (match1.Success)
    { Result = true; }
    Match match2 = regexObj2.Match(input);
    if (match2.Success)
    { Result = true; }
    Match match3 = regexObj3.Match(input);
    if (match3.Success)
    { Result = true; }
    return Result;
}
4

1 回答 1

1

您对我们有什么期望?你甚至没有给我们有效/无效的字符串。您是否以某种方式测试过您的正则表达式?

在不了解有效输入的情况下,我第一眼看到的是:

  1. 我可以看到的一个警告是邮政信箱模式必须位于字符串的开头

    您是否只想在字符串的开头匹配它?您需要知道这一点并在您的模式中定义它。如果您不想这样做,则删除字符串锚点的开头^并将其替换为单词边界 \b

  2. {1}是多余的,你可以删除它。

  3. 因为{0,1}有一个 shortform ?,我更喜欢这个,因为它更短。

  4. ^box((\s){1}|[0-9]{1})匹配“框”后跟一个空格或后跟一个数字。这真的是你想要匹配的吗?

  5. (\.)在第一个正则表达式中:为什么要对单个点进行分组?

于 2013-09-05T20:01:47.963 回答