PO Box正则表达式验证

s15*_*99d 12 javascript regex jquery

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

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

    });
});
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Dat*_*han 38

我尝试了在互联网上找到的几个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" 
]; 
Run Code Online (Sandbox Code Playgroud)

  • 我认为除了"#123"是一个有效的po盒之外,这个是有道理的 (2认同)
  • 我删除了井号(例如第一个测试#123),因为它可能是有效的门牌号或其他内容:^ *(((box | bin)[-。\ / \\]?\ d +)|(。* p [ \。]??((o | 0)[-。\ / \\]?*-?((box | bin)| b |(#| num)?\ d +))|(p(ost)?*( o(ff(ice)?)?)?*((box | bin)| b)?* \ d +)|(p *-?\ /?(o)?*-?box)|邮政信箱|( (box | bin)| b)*(number | num |#)?* \ d * \ d +) (2认同)
  • 意识到这个旧但它在谷歌中仍然排名靠前。上面的正则表达式在许多有效地址上都失败了,仅供参考。示例:123 Harpo Box Street, 123 Poblano Lane (2认同)

dru*_*dge 16

在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');
Run Code Online (Sandbox Code Playgroud)

此外,您可以通过使用不区分大小写的匹配来减少您的模式:

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

注意:您的正则表达式也匹配以下地址:

  • 123穷人路
  • 123 Harpo Box Street

我建议还检查字符串中的数字.也许以前的答案中的这种模式会有所帮助:

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

(它不会与拼写出的"邮局"或数字替换相匹配..但它是一个开始.)


rid*_*ner 5

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

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

(不需要反斜杠!)