PO Box Regular Expression Validation

前端 未结 11 2188
攒了一身酷
攒了一身酷 2020-12-05 03:19

Here\'s my code, but I can\'t ever trigger the alert.

$(document).ready( function (){
    $(\"[id*=\'txtAddress1S\']\").blur(function() {
        var pattern         


        
相关标签:
11条回答
  • 2020-12-05 03:47

    With Javascript its easier to use a regex literal like so:

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

    (No backslashes required!)

    0 讨论(0)
  • 2020-12-05 03:52

    We ran into false positive PO Boxes after using @Dathan's answer in production for a few months. This simplified version ensures the pattern is followed by a number so won't match things like "Expo Blvd". It also allows things like "#123" and "B1" commonly found in address2 fields for apartment/unit/suite numbers. You can play around with it and add your own test cases here: 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 讨论(0)
  • 2020-12-05 03:59

    This is what i have used accounting for spaces and case insensitive:

    http://regexr.com/3cc2q

    var pattern = /\bP(ost|ostal)?([ \.]*(O|0)(ffice)?)?([ \.]*Box)?\b/i;
    
    • fail - po box
    • fail - p.o. box
    • fail - po bo
    • fail - post office box
    • fail - P.O. Box
    • fail - PO. Box
    • fail - PO Box
    • fail - POBox
    • fail - P O Box
    • fail - P.O Box
    • fail - PO
    • fail - Postal Box
    • fail - Post Office Box
    • pass - poop box
    • pass - pony box
    0 讨论(0)
  • 2020-12-05 03:59

    Here's one that matches 'POB', 'PO Box'and 'Post Office Box'. Pattern:

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

    It's a modification of @drudge's solution.

    0 讨论(0)
  • 2020-12-05 04:05

    I found a pattern that works for most realistic post office addresses. Also had to fall to this after getting false positive with @jonathan-marzullo's answer for Rural Route Post 1 which is not a postal address.

    My pattern is

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

    Matches for the following cases:

    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
    

    Doesn't match the following cases:

    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 讨论(0)
  • 2020-12-05 04:07

    In javascript, you have to escape your slashes:

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

    Also, you could reduce your pattern a bit by using case-insensitive matching:

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

    Note: Your regex also matches on addresses such as:

    • 123 Poor Box Road
    • 123 Harpo Box Street

    I would suggest also checking for a number in the string. Perhaps this pattern from a previous answer would be of some help:

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

    (it won't match on "Post Office" spelled out, or the numeric replacements.. but it's a start.)

    0 讨论(0)
提交回复
热议问题