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

时间:2014-04-22 07:46:35

标签: javascript jquery regex validation jquery-forms-plugin

我正在使用表单验证插件并使用正则表达式来验证英国邮政编码。我正在使用This reference正则表达式,其中作者说它可以验证所有邮政编码。但是当我尝试提交表单时,对于每种字符串,它都表示无效。我尝试了以下内容(样本取自维基百科Here is page

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
});
});

任何人都可以帮助我解决这段代码的错误

2 个答案:

答案 0 :(得分:0)

如果没有深入检查正则表达式代码,我可以看到它与任何空格都不匹配(如果不是在第一个块和最后一个......):你是否可能需要从邮政编码中删除空格(& #34; W1A 1HQ EC1A 1BB M1 1AA B33 8TH"在你的测试用例中,如果我理解正确的话)在匹配正则表达式之前?

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

请注意regexp有不同的口味&#34; ...例如,JS风味与Perl的不同......可能你不能在JavaScript中使用给定的regexp &#39; as-is&#39;,但你可能应该&#34;做饭&#39;它在JS风味......: - )

另请参阅herehere,其中给出了(可能)更好的正则表达式:

^(([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}))$

答案 1 :(得分:0)

有一些奇怪的事情。

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

其次,regexp是用与JavaScript中使用的不同的透明文本编写的(我不知道哪一个)。表达式[A-Z-[IJZ]]可能意味着&#34;除IJZ&#34;以外的任何大写字母。在Javascript中,它表示&#34;任何大写字母或-[后跟]&#34;。还有一些不必要的parantheses。

我没有花时间修复正则表达式。但是我删除了一些位来检查是否还有其他问题。所以这个应该匹配所有有效的邮政编码(以及许多无效的邮编):

/(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}/