正则表达式不适用于jquery表单验证插件



我使用表单验证插件,并使用正则表达式验证英国邮政编码。我使用的是This引用正则表达式,作者在其中说它可以验证所有的后代码。但是当我试图提交表单时,对于每一种字符串,它都表示无效。我尝试了以下(样本取自维基百科)这是页面

W1A 1HQ
EC1A 1BB
M1 1AA
B33 8TH

这是我的JS代码

$(document).ready(function(){
$.validator.addMethod("regex", function(value, element, regexp) {
            var re = new RegExp(regexp);
            console.debug(re.test(value))
            return this.optional(element) || re.test(value);
        },
        "Post code is not valid"
);
$("#addPropertyForm").validate({
    rules : {
        postCode : {
            required : true,
            regex: "(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})"
        }
    },
    messages : {
        postCode : {
            required : 'Post code is required',
        }
    },
    onkeyup: false,
    onblur: true,
    focusCleanup: true,
    focusInvalid: false
});
});

有人能帮我这个代码出了什么问题吗?

这里面有一些奇怪的地方。

首先,您发布的示例邮政编码实际上是四个邮政编码的串联:W1A 1HQ、EC1A 1BB、M1 1AA和B33 8TH。

其次,regexp是用与JavaScript中使用的方言不同的方言编写的(我不知道是哪一种)。表达式[A-Z-[IJZ]]可能意味着"除IJZ之外的任何大写字母"。在Javascript中,它的意思是"任何大写字母或-[后跟]"。其中也有一些不必要的副题

我没有花时间修复regexp。然而,我删除了一些部分,以检查是否还有其他问题。因此,这个应该匹配所有有效的邮政编码(以及许多无效的邮政编码):

/(GIR 0AA|[A-Z][0-9][0-9]?|[A-Z][A-Z][0-9][0-9]?|[A-Z][0-9][A-HJKSTUW]|[A-Z][A-Z][0-9][ABEHMNPRVWXY]) [0-9][A-Z]{2}/

在不深入检查正则表达式代码的情况下,我可以看到它与任何空格都不匹配(如果不是在第一个块和最后一个块中…):在与正则表达式匹配之前,您是否只需要从邮政编码中去掉空格(如果我理解正确的话,在测试用例中为"W1A 1HQ EC1A 1BB M1 1AA B33 8TH")?

更新:O.p.确实更正了问题(测试代码中有4个不同的…),所以我上面的答案不再有任何意义了…:-)

请注意regexp有不同的"口味"。。。例如,JS风格与Perl风格不同。。。可能您不能在JavaScript中"按原样"使用给定的regexp,但您可能应该在JS风格中"烹饪"它…:-)

另请参阅此处和此处,其中给出了(可能)更好的regexp:

^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

最新更新