【问题标题】:PO Box Regular Expression Validation邮政信箱正则表达式验证
【发布时间】:2011-08-06 12:11:03
【问题描述】:

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

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

    });
});

【问题讨论】:

    标签: javascript jquery regex


    【解决方案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 号

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

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

    (它与拼写的“邮局”或数字替换不匹配……但这是一个开始。)

    【讨论】:

      【解决方案2】:

      使用 Javascript 更容易像这样使用正则表达式:

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

      (不需要反斜杠!)

      【讨论】:

        【解决方案3】:

        我尝试了几种在 Internet 上找到的 PO Box RegExp 模式,包括发布在 Stack Overflow 上的模式,但都没有通过我们的测试要求。因此,我在下面发布了我们的 RegExp 和我们的测试集:

        var poBox = /^ *((#\d+)|((box|bin)[-. \/\\]?\d+)|(.*p[ \.]? ?(o|0)[-. \/\\]? *-?((box|bin)|b|(#|n|num|number)?\d+))|(p(ost|ostal)? *(o(ff(ice)?)?)? *((box|bin)|b)? *(#|n|num|number)*\d+)|(p *-?\/?(o)? *-?box)|post office box|((box|bin)|b) *(#|n|num|number)? *\d+|(#|n|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", 
            "Post Box #123" 
        ];
        
        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" 
        ]; 
        

        【讨论】:

        • 777 Post Offie Box = 返回 false
        • 这似乎错过了Post Box #123
        • 我认为这个有意义,除了“#123”是一个有效的邮政信箱
        • 我删除了井号(就像第一个测试 #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+)
        • 意识到这一点,但它仍然在谷歌中排名很高。上面的正则表达式在许多有效地址上都失败了,仅供任何发现此问题的人参考。示例:123 Harpo Box Street, 123 Poblano Lane
        【解决方案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;
          
          • 失败 - 邮箱
          • 失败 - p.o.盒子
          • 失败 - 波波
          • 失败 - 邮政信箱
          • 失败 - P.O.盒子
          • 失败 - 采购订单。盒子
          • 失败 - 邮政信箱
          • 失败 - 邮政信箱
          • 失败 - 邮政信箱
          • 失败 - 邮政信箱
          • 失败 - PO
          • 失败 - 邮箱
          • 失败 - 邮政信箱
          • 通过 - 便便盒
          • 通过 - 小马盒

          【讨论】:

          • “1223 P Street”和“34 PO Road”失败
          • 小修改/\bP(ost|ostal)?([ \.]*(O|0)(ffice)?)?([ \.]*Box)\b/i
          • 原件在 Post Rd 上失败。或邮政路。这是很常见的。 Rob 上面的回答解决了这个问题
          【解决方案6】:

          它对我有用,

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

          【讨论】:

            【解决方案7】:

            这是与“POB”、“PO Box”和“Post Office Box”匹配的一个。图案:

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

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

            【讨论】:

              【解决方案8】:

              上面提供的正则表达式正在接受正确的邮政信箱。 修改后的 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 的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"
                ];
                

                【讨论】:

                  【解决方案10】:

                  我发现了一种适用于大多数真实邮局地址的模式。在@jonathan-marzullo 的answer 误报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]......

                    【讨论】:

                    • 请花时间指出您在正则表达式中所做的更改以及原因。对于具有现有答案的旧问题,解释您的答案有何不同以及自提出问题以来的时间流逝是否提供了不同的答案非常有用。
                    【解决方案12】:

                    这是我的版本(Java):

                    1. 邮政信箱后面应该有一个数字
                    2. 有效的邮政信箱可以是较长地址的一部分,例如“我的地址详细信息邮政信箱 123”是有效的邮政信箱地址。
                    3. 可以使用 BIN 代替 BOX
                    import java.util.Random;
                    import java.util.regex.Pattern;
                    
                    public class Demo {
                        public static final Pattern POST_OFFICE_BOX_PATTERN = Pattern.compile("([\\w\\s*\\W]*(P(OST)?.?\\s*((O(FF(ICE)?)?)?.?\\s+B(IN|OX))+))\\s*\\d+[\\w\\s*\\W]*");
                    
                        public static void main(String[] args) {
                            testInvalidAddresses();
                            testValidAddresses();
                        }
                    
                        public static void testValidAddresses() {
                            String[] matches = new String[]{"HC73 P.O. Box 217",
                                    "P O Box125",
                                    "P.O. Box 123",
                                    "PO Box " + Math.abs(new Random().nextInt()),
                                    "PO Bin " + Math.abs(new Random().nextInt()),
                                    "Post Office Box 123",
                                    "Post Office Bin 123",
                                    "Post Off. Box 123",
                                    "Post Box 123",
                                    "po bin 123"};
                    
                            for (String address : matches) {
                                boolean isPoBox = isValidPostOfficeBox(address.toUpperCase());
                                if (!isPoBox) {
                                    throw new IllegalArgumentException(address);
                                }
                            }
                        }
                    
                        public static void testInvalidAddresses() {
                            var noMatches = new String[]{"#123",
                                    "Box 123",
                                    "Box-122",
                                    "Box122",
                                    "P. O. Box",
                                    "P.O. Box",
                                    "P.O.B 123",
                                    "P.O.B. 123",
                                    "P.O.B.",
                                    "P0 Box",
                                    "PO 123",
                                    "PO Box",
                                    "PO-Box",
                                    "POB 123",
                                    "POB",
                                    "POBOX123",
                                    "Po Box",
                                    "Post 123",
                                    "Post Office Box",
                                    "box #123",
                                    "box 122",
                                    "box 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 bin",
                                    "po box",
                                    "po num123",
                                    "po-box",
                                    "pobox",
                                    "pobox123",
                                    "post office box",
                                    "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",
                                    "PzBzzzzzzzzz",
                                    "PzzBzzzzzzzzz",
                                    "PzzzBzzzzzzzzz",
                                    "PzzzzBzzzzzzzzz",
                                    "zzzPzBzzzzzzzzz",
                                    "zzzPzzBzzzzzzzzz",
                                    "zzzPzzzBzzzzzzzzz",
                                    "zzzPzzzzBzzzzzzzzz",
                                    "P.O 123",
                                    "Washington Post 42",
                                    "PO binary 123",
                                    "p b",
                                    "p  b",
                                    "Piebert",
                                    "Pebble",
                                    "pb"};
                    
                            for (String address : noMatches) {
                                boolean isPoBox = isValidPostOfficeBox(address);
                                if (isPoBox) {
                                    throw new IllegalArgumentException(address);
                                }
                            }
                        }
                    
                        public static boolean isValidPostOfficeBox(String value) {
                            if (value != null) {
                                return POST_OFFICE_BOX_PATTERN.matcher(value.toUpperCase()).matches();
                            }
                            return false;
                        }
                    }
                    

                    【讨论】:

                      【解决方案13】:

                      如果你去掉所有的点“。”和空格然后将其转换为小写,您只需要检查字符串是否以pobpostofficebox 开头,

                      (信用BarCotter

                      【讨论】:

                        【解决方案14】:

                        这个正则表达式适用于所有场景。主要区别

                        ^([ A-Za-z0-9_:/#,]*)((((((P(ost(al)?)?)|(Mail(ing)?)))([ \\./#-]*)((((O|0)(ffice)?)|(B(ox|in)?))))|(B(ox|in)?))([ \\./#-]*))(B(ox|in)?)?(([ \\./#-]*)((n(um(ber)?)?)|no)?)([ \\.:/#-]*)([0-9]+)([ A-Za-z0-9_:/#,]*)$
                        

                        此正则表达式匹配以下地址模式集。

                        我还在开头和结尾添加了 ([ A-Za-z0-9_:/#,]*) 模式,以支持在任何其他地址字符串之间存在模式。例如 123 Main St,P.O.Box 458。

                        构造定义如下: (((Postal|Mailing){SEP}(Office|(Box|Bin)))|(Box|Bin)){SEP}(Box|Bin)?{SEP}(number|no){SEP}([0 -9]+)

                        它通过以下方式解决了上述问题 anson, 苦力, 洛基, jatto abdul

                        这是使用 Java 8+ 验证的

                        Pattern pattern = Pattern.compile(REG_EX, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE );
                        
                        boolean result = pattern.matcher(sequence).matches();
                        

                        通过

                        • 邮政信箱框:真
                        • p.O.框:真
                        • p.o.框:真
                        • 邮政信箱:真实
                        • 邮政信箱:真实
                        • 邮箱:真实
                        • 邮政信箱:是的
                        • 帖子 b:真实
                        • po b: 是的
                        • 帖子:真实
                        • 邮局:是的
                        • 邮政信箱:真实
                        • 邮政信箱:真实
                        • 邮政信箱:是的
                        • 邮箱:是的
                        • 框 123:正确
                        • Box-122:真
                        • Box122:真
                        • HC73 邮政信箱方框 217:正确
                        • 邮政信箱125:真
                        • 页。 O. Box:正确
                        • P.O 123:是的
                        • 邮政信箱方框 123:正确
                        • 邮政信箱框:真
                        • P.O.B 123:是的
                        • P.O.B. 123:真的
                        • P.O.B.:真实
                        • P0 框:真
                        • 采购订单 123:正确
                        • 邮政信箱:真实
                        • 邮政信箱:真
                        • POB 123:真
                        • POB:真
                        • POBOX123:真
                        • 邮政信箱:真实
                        • 帖子 123:正确
                        • 邮箱 123:正确
                        • 邮政信箱 123:真
                        • 邮政信箱:真实
                        • 框 #123:是的
                        • 框 122:是的
                        • 框 123:是的
                        • P 框:真
                        • 邮政信箱:真
                        • 邮政信箱:真
                        • 邮政信箱:真实
                        • 邮政信箱框:真
                        • 邮政信箱:真实
                        • 邮政信箱#123: 真的
                        • 邮政信箱:真实
                        • 邮政信箱:真
                        • 宝 #123:是的
                        • 邮政信箱 123:是的
                        • 邮政信箱:真实
                        • Po num123: 真
                        • 邮箱:真
                        • 邮箱:真
                        • Pobox123:真
                        • 邮政信箱:真实
                        • 邮箱 #123:是的

                        失败

                        • 邮政信箱 N:假
                        • 编号 123:错误
                        • #123: false(Cole W 提到。我根据 Tony Smith 提到的类似逻辑将其删除)
                        • 主街 123 号:假
                        • 可怜的盒子街 123 号:假
                        • 可怜的盒子路 123 号:假
                        • 宾街 123 号:假
                        • 123 Harpo Box Street:假
                        • 123 Poblano Lane: false
                        • 邮政之路:假
                        • 博士山:假
                        • 123 Some Street: false
                        • 控制器办公室:假
                        • 波罗街:假
                        • 123 box canyon rd: false
                        • 777 Post Oak Blvd:假

                        【讨论】:

                        • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-03-23
                        • 1970-01-01
                        • 2011-07-06
                        • 2015-09-28
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多