Проверка правильности регулярного выражения почтового ящика - PullRequest
12 голосов
/ 15 апреля 2011

Вот мой код, но я не могу вызвать предупреждение.

$(document).ready( function (){
    $("[id*='txtAddress1S']").blur(function() {
        var pattern = new RegExp('\b[P|p]*(OST|ost)*\.*\s*[O|o|0]*(ffice|FFICE)*\.*\s*[B|b][O|o|0][X|x]\b');
        if ($("[id*='txtAddress1S']").val().match(pattern)) {
            alert('We are unable to ship to a Post Office Box.\nPlease provide a different shipping address.'); 
        }

    });
});

Заранее спасибо!

Ответы [ 10 ]

35 голосов
/ 12 августа 2014

Я попробовал несколько шаблонов PO Box RegExp, найденных в Интернете, включая шаблоны, опубликованные в Stack Overflow, но ни один из них не прошел наши тестовые требования.Следовательно, я разместил наш RegExp ниже и наши тестовые наборы:

var poBox = /^ *((#\d+)|((box|bin)[-. \/\\]?\d+)|(.*p[ \.]? ?(o|0)[-. \/\\]? *-?((box|bin)|b|(#|num)?\d+))|(p(ost)? *(o(ff(ice)?)?)? *((box|bin)|b)? *\d+)|(p *-?\/?(o)? *-?box)|post office box|((box|bin)|b) *(number|num|#)? *\d+|(num|number|#) *\d+)/i;

var matches = [ //"box" can be substituted for "bin" 
    "#123", 
    "Box 123", 
    "Box-122", 
    "Box122", 
    "HC73 P.O. Box 217", 
    "P O Box125", 
    "P. O. Box", 
    "P.O 123", 
    "P.O. Box 123", 
    "P.O. Box", 
    "P.O.B 123",
    "P.O.B. 123", 
    "P.O.B.", 
    "P0 Box", 
    "PO 123", 
    "PO Box N", 
    "PO Box", 
    "PO-Box", 
    "POB 123", 
    "POB", 
    "POBOX123",
    "Po Box", 
    "Post 123", 
    "Post Box 123", 
    "Post Office Box 123", 
    "Post Office Box", 
    "box #123", 
    "box 122", 
    "box 123", 
    "number 123", 
    "p box", 
    "p-o box", 
    "p-o-box", 
    "p.o box", 
    "p.o. box", 
    "p.o.-box", 
    "p.o.b. #123", 
    "p.o.b.", 
    "p/o box", 
    "po #123", 
    "po box 123", 
    "po box", 
    "po num123", 
    "po-box", 
    "pobox", 
    "pobox123", 
    "post office box" 
];

var nonMatches = [ 
    "The Postal Road", 
    "Box Hill", 
    "123 Some Street", 
    "Controller's Office", 
    "pollo St.", 
    "123 box canyon rd", 
    "777 Post Oak Blvd", 
    "PSC 477 Box 396", 
    "RR 1 Box 1020" 
]; 
15 голосов
/ 15 апреля 2011

В javascript вы должны избегать косой черты:

var pattern = new RegExp('\\b[P|p]*(OST|ost)*\\.*\\s*[O|o|0]*(ffice|FFICE)*\\.*\\s*[B|b][O|o|0][X|x]\\b');

Кроме того, вы можете немного уменьшить свой шаблон с помощью сопоставления без учета регистра:

var pattern = new RegExp('\\b[p]*(ost)*\\.*\\s*[o|0]*(ffice)*\\.*\\s*b[o|0]x\\b', 'i');

Примечание: Ваше регулярное выражение также соответствует адресам, таким как:

  • 123 Poor Box Road
  • 123 Harpo Box Street

Я бы предложил также проверить число в строке. Возможно, эта модель из предыдущего ответа будет полезна:

var pattern = new RegExp('[PO.]*\\s?B(ox)?.*\\d+', 'i');

(оно не будет совпадать с прописным "Почтовым отделением" или числовыми заменами ... но это только начало.)

5 голосов
/ 15 апреля 2011

С Javascript проще использовать регулярные выражения, например:

var pattern = /\b(?:p\.?\s*o\.?|post\s+office)\s+box\b/i;

(Обратной черты не требуется!)

1 голос
/ 07 декабря 2015

Это то, что я использовал для учета пробелов и без учета регистра:

http://regexr.com/3cc2q

var pattern = /\bP(ost|ostal)?([ \.]*(O|0)(ffice)?)?([ \.]*Box)?\b/i;
  • сбой - почтовый ящик
  • сбой - стр. О. коробка
  • сбой - по бо
  • сбой - почтовый ящик
  • сбой - П.О. Box
  • сбой - PO. Box
  • сбой - PO Box
  • сбой - POBox
  • сбой - P O Box
  • сбой - P.O Box
  • сбой - PO
  • сбой - Почтовый ящик
  • сбой - Почтовый ящик
  • pass - poop box
  • pass - pony box
0 голосов
/ 07 февраля 2019

Я нашел шаблон, который работает для наиболее реалистичных адресов почтовых отделений.Также пришлось упасть на это после получения ложного положительного результата с ответом @ jonathan-marzullo для Rural Route Post 1, который не является почтовым адресом.

Мой шаблон

pattern = P([.]?(O|0)[.]?|ost|ostal).((O|0)ffice.)?Box{1}\b/i

Подходит для следующих случаев:

PO Box
P.O. Box
PO. Box
po box
P.o box
po box
p.o. box
post office box
P.O. Box
PO. Box
PO Box
Postal Box
Post Office Box
P.O Box
post office box 1
postal office box 1
postal box 1

Не соответствует следующим случаям:

post office b 1
post off box 1
post off b 1
post o box 1
post o b 1
p office box 1
p office b 1
p off box 1
p off b 1
p o box 1
p-o-b-1
p.o.b.1
POB
pob #1
pob num1
pob number1
foo pob1
box #1
po 1
pb 1
Expo Blvd
Rural Route Box 1
Army Post 1
postal office 1
poop box
pony box
POBox
P O Box
PO
po bo
Pobox
Post
0 голосов
/ 03 октября 2018

Мы столкнулись с ложными положительными почтовыми ящиками после использования @ Dathan's answer в производстве в течение нескольких месяцев. Эта упрощенная версия гарантирует, что за шаблоном следует число, поэтому оно не будет совпадать с такими вещами, как «Экспо бульвар». Он также допускает такие вещи, как "# 123" и "B1", обычно встречающиеся в полях address2 для номеров апартаментов / апартаментов / апартаментов. Вы можете поиграть с ним и добавить свои собственные тестовые примеры здесь: https://regex101.com/r/7ZUQFl/2

const re = /^\s*(.*((p|post)[-.\s]*(o|off|office)[-.\s]*(b|box|bin)[-.\s]*)|.*((p|post)[-.\s]*(o|off|office)[-.\s]*)|.*((p|post)[-.\s]*(b|box|bin)[-.\s]*)|(box|bin)[-.\s]*)(#|n|num|number)?\s*\d+/i;
const matches = [
  "post office box 1",
  "post office b 1",
  "post off box 1",
  "post off b 1",
  "post o box 1",
  "post o b 1",
  "p office box 1",
  "p office b 1",
  "p off box 1",
  "p off b 1",
  "p o box 1",
  "p-o-b-1",
  "p.o.b.1",
  "POB1",
  "pob #1",
  "pob num1",
  "pob number1",
  "foo pob1",
  "box #1",
  "po 1",
  "pb 1"
];
const nonMatches = [ 
  "Expo Blvd",
  "Rural Route Box 1",
  "Army Post 1",
  "B1",
  "#1",
  "N1",
  "Number 1",
  "Num 1"
];
0 голосов
/ 26 июня 2018

Регулярное выражение, приведенное выше, принимает почтовый ящик, который является правильным. Модифицированный Regex не принимать это:

var pattern = /^ *(?!(#\d+)|((box|bin)[-. \/\\]?\d+)|(.*p[ \.]? ?(o|0)[-. \/\\]? *-?((box|bin)|b|(#|num)?\d+))|(p(ost)? *(o(ff(ice)?)?)? *((box|bin)|b)? *\d+)|(p *-?\/?(o)? *-?box)|post office box|((box|bin)|b) *(number|num|#)? *\d+|(num|number|#)|(?![a-zA-Z0-9\x20'#,]) *\d+)/i;
0 голосов
/ 21 марта 2018

Вот тот, который соответствует 'POB', 'PO Box' и 'Post Box Box'.Шаблон:

\\b[PO.|Post\\sOffice]*\\s?B(ox)?.*\\d+\\b.

Это модификация решения @drudge.

0 голосов
/ 26 июня 2017

Это сработало для меня,

var poRegex = /\bP(ost|ostal)?([ \.]*O(ffice)?)?([ \.]*Box)?\b/i;
0 голосов
/ 09 сентября 2014

Этот работает очень хорошо для нас.(php preg_match)

$pattern = '!p(ost)?\.?\s*o(ffice)?\.?(box|\s|$)!i';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...