PO Box正则表达式验证

时间:2011-04-15 17:03:50

标签: javascript jquery regex

这是我的代码,但我无法触发警报。

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

    });
});

提前致谢!

11 个答案:

答案 0 :(得分:35)

我尝试了在互联网上找到的几个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" 
]; 

答案 1 :(得分:15)

在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

我建议还检查字符串中的数字。也许来自previous answer的这种模式会有所帮助:

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

(拼写出来的“邮局”不匹配,或数字替换......但这是一个开始。)

答案 2 :(得分:5)

使用Javascript更容易使用正则表达式文字,如下所示:

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

(不需要反斜杠!)

答案 3 :(得分:1)

这是我使用空间和不区分大小写的方法:

http://regexr.com/3cc2q

var pattern = /\bP(ost|ostal)?([ \.]*(O|0)(ffice)?)?([ \.]*Box)?\b/i;
  • 失败 - po box
  • 失败 - p.o。框
  • 失败 - po bo
  • 失败 - 邮政信箱
  • 失败 - P.O。框
  • 失败 - PO。框
  • 失败 - 邮政信箱
  • 失败 - POBox
  • 失败 - P O Box
  • 失败 - P.O Box
  • 失败 - PO
  • 失败 - 邮箱
  • 失败 - 邮政信箱
  • 传递 - 便便盒
  • 传递 - 小马框

答案 4 :(得分:0)

这个对我们来说非常好。 (php preg_match)

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

答案 5 :(得分:0)

它为我工作,

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

答案 6 :(得分:0)

这里有一个匹配'POB','PO Box'和'Post Office Box'。图案:

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

这是@drudge解决方案的修改。

答案 7 :(得分:0)

上面提供的正则表达式接受正确的邮政信箱。 修改后的正则表达式不接受的是:

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;

答案 8 :(得分:0)

在生产中使用@Dathan的answer几个月后,我们遇到了误报邮政信箱。此简化版本可确保模式后跟数字,因此不会与“ Expo Blvd”之类的东西匹配。它还允许在address2字段中常见的“#123”和“ B1”之类的公寓/单位/套房编号。您可以试用它,并在此处添加自己的测试用例: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"
];

答案 9 :(得分:0)

我找到了适用于大多数现实邮局地址的模式。在@ jonathan-marzullo的Rural Route Post 1的{​​{3}}误报后,也不得不落入这一点,这不是邮政地址。

我的模式是

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

答案 10 :(得分:0)

JavaScript:

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

您只需要使用^来启动正则表达式,例如:^\b[P|p]......