Тестирование на почтовый ящик во всех его формах - PullRequest
5 голосов
/ 10 марта 2011

У нас есть страница на C # ASP.Net, где клиент вводит адрес, на котором почтовое отделение запрещено, поскольку мы используем UPS для доставки этих товаров. Клиенты - творческие люди, и они придумывают творческие средства маркировки P.O. Box.

У нас есть шаблон 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

Эти примеры на самом деле являются ценностями, которые пользователи, по своей щедрой природе, предоставили нам. ;)

Я всегда готов к упрощению.

1 Ответ

21 голосов
/ 10 марта 2011

Я думаю, это должно быть близко к тому, что вы ищете:

(?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'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...