Регулярное подтверждение выражений в ящике PO Box

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

$(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.'); 
        }

    });
});

Ответ 1

В 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 Плохое окно с канатной дорогой.
  • 123 Harpo Box Street

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

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

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

Ответ 2

Я попробовал несколько шаблонов 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 Office", 
    "pollo St.", 
    "123 box canyon rd", 
    "777 Post Oak Blvd", 
    "PSC 477 Box 396", 
    "RR 1 Box 1020" 
]; 

Ответ 3

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

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

(Нет необходимости использовать обратную косую черту!)

Ответ 4

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

$pattern = '!p(ost)?\.?\s*o(ffice)?\.?(box|\s|$)!i';

Ответ 5

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

http://regexr.com/3cc2q

var pattern = /\bP(ost|ostal)?([ \.]*(O|0)(ffice)?)?([ \.]*Box)?\b/i;
  • fail - po box
  • fail - p.o. коробка
  • fail - po bo
  • fail - почтовый ящик
  • fail - P.O. Box
  • fail - ПО. Box
  • fail - Почтовый ящик
  • fail - POBox
  • fail - Блок P O
  • fail - P.O Box
  • fail - ПО
  • fail - Почтовый ящик
  • fail - Почтовый ящик
  • pass - poop box
  • pass - pony box

Ответ 6

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

var poRegex = /\bP(ost|ostal)?([ \.]*O(ffice)?)?([ \.]*Box)?\b/i;

Ответ 7

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

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

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

Ответ 8

Приведенное выше регулярное выражение принимает правильное поле PO. Модифицированный 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;

Ответ 9

Мы столкнулись с ложными положительными почтовыми ящиками после использования @Dathan ответа в производстве в течение нескольких месяцев. Эта упрощенная версия гарантирует, что за шаблоном следует число, поэтому оно не будет совпадать с такими вещами, как "Экспо бульвар". Он также допускает такие вещи, как "# 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"
];

Ответ 10

Я нашел шаблон, который работает для самых реалистичных почтовых адресов. Также пришлось упасть на это после получения ложного положительного ответа @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

Ответ 11

JavaScript:

^\b[P|p]*(OST|ost)*\.*\s*[O|o|0]*(ffice|FFICE)*\.*\s*[B|b][O|o|0][X|x]\b

Вам просто нужно запустить регулярное выражение с ^, например: ^\b[P|p]......