微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PO Box正则表达式验证

如何解决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]......
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。