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

    });
});
    

解决方法

在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号 我建议也检查字符串中的数字。先前答案中的这种模式可能会有所帮助:
var pattern = new RegExp(\'[PO.]*\\\\s?B(ox)?.*\\\\d+\',\'i\');
(它在拼写的“邮局”或数字替换上不匹配。但这只是一个开始。)     ,我尝试了在互联网上找到的几种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\" 
]; 
    ,使用Javascript可以更容易地使用正则表达式文字,如下所示:
var pattern = /\\b(?:p\\.?\\s*o\\.?|post\\s+office)\\s+box\\b/i;
(不需要反斜杠!)     ,这对我们来说很好。 (php preg_match)
$pattern = \'!p(ost)?\\.?\\s*o(ffice)?\\.?(box|\\s|$)!i\';
    ,这就是我用来解释空格和不区分大小写的内容: http://regexr.com/3cc2q
var pattern = /\\bP(ost|ostal)?([ \\.]*(O|0)(ffice)?)?([ \\.]*Box)?\\b/i;
失败-邮箱 失败-p.o.框 失败-宝 失败-邮政信箱 失败-P.O.框 失败-PO。框 失败-邮政信箱 失败-POBox 失败-邮政信箱 失败-邮政信箱 失败-PO 失败-邮政信箱 失败-邮政信箱 传递-便便盒 通过-小马箱     ,它对我有用
var poRegex = /\\bP(ost|ostal)?([ \\.]*O(ffice)?)?([ \\.]*Box)?\\b/i;
    ,这是与\'POB \',\'PO Box \'和\'Post Office Box \'匹配的一个。图案:
\\\\b[PO.|Post\\\\sOffice]*\\\\s?B(ox)?.*\\\\d+\\\\b
。 它是对ѭ10解决方案的修改。     ,上面提供的正则表达式接受正确的邮政信箱。 修改后的正则表达式不接受的是:
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;
    ,在生产中使用@Dathan的答案几个月后,我们遇到了误报PO Boxs。此简化版本可确保模式后跟数字,因此不会匹配\“ 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\"
];
    ,我发现了一种适用于大多数现实邮局地址的模式。在用@ 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
    ,JavaScript:
^\\b[P|p]*(OST|ost)*\\.*\\s*[O|o|0]*(ffice|FFICE)*\\.*\\s*[B|b][O|o|0][X|x]\\b
您只需要以
^
开头正则表达式即可,例如:
^\\b[P|p]......
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...