正则表达式验证问题

时间:2014-01-29 00:24:33

标签: regex

我只是想知道你是否可爱的人能够给我一些关于我可能出错的地方的指示。

我已经为英国固定电话号码实施了一个正则表达式检查程序,除了一组数字外,它似乎都有用。这是我第一次使用正则表达式。

以下是我正在使用的正则表达式:

((01([2-69][1]\s?\d{3}\s?\d{4}$|[2-9][02-9][0-9]\s?\d{3}\s?\d{3}$)))|((02((0\s?[378]\s?(\d{3}|\d{4})\s?\d{4})|([3489]{1}\d{2}\s?\d{3})\s?\d{3})))

给我带来麻烦的小组是

((02(((0\s?[378]\s?(\d{3}|\d{4})\s?\d{4})$)... (in the interests of brevity, I have cut out the remaining portion of it. The parentheses are all present and correct in the full regex

我已针对regexpal进行了检查,似乎验证正确。

我使用了测试号

    02031111111 <- Valid
    0203 111 1111 <- Valid
    020 3111 1111 <- Valid
    020311111111 <- Invalid (passes validation)
    0203 11111111 <- Invalid (passes validation)
    020 3111 11111 <- Invalid (fails validation - which is what I want)

这是执行正则表达式功能的代码块

function valid_phone(landline, country) 
            {
                var homep = '';

                switch (country)
                {
                    case 'England':
                        homep = /^((01([2-69][1]\s?\d{3}\s?\d{4}$|[2-9][02-9][0-9]\s?\d{3}\s?\d{3}$)))|((02((0\s?[378]\s?(\d{3}|\d{4})\s?\d{4})|([3489]{1}\d{2}\s?\d{3})\s?\d{3})))$/;
                        break;
                    case 'USA':
                        homep = /^((((\(\d{3}\))|(\d{3}(-| )))\d{3}(-| )\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))$/;
                        break
                    default:
                        homep = /^((01([2-69][1]\s?\d{3}\s?\d{4}$|[2-9][02-9][0-9]\s?\d{3}\s?\d{3}$)))|((02(((0\s?[378]\s?(\d{3}|\d{4})\s?\d{4}))|([3489]{1}\d{2}\s?\d{3})\s?\d{3}$)))$/;
                }
                return homep.test(landline);
            }

这是在jQuery中调用的地方

$('#landline').blur(function()
            {
                $lp = $('#landline').val();
                $co = $('#country').val();

                if (!valid_phone($lp, $co))
                {
                    $('#error').slideDown();
                    $('#error').append('Wrong phone number format');
                }
                else
                {
                    $('#error').slideUp();
                    $('#error').html('');
                }
            });

正如我所说,任何指针都会受到赞赏。我确信这很简单。我在最后一次尝试之前没有使用$,但它仍然是相同的。

提前致谢。

1 个答案:

答案 0 :(得分:1)

据我所知,空格只允许在数字的某些地方,但数字的位数是固定的。在这种情况下,问题出在这里:

(\d{3}|\d{4})

这匹配3或4位数字,因此它可以接受超长数字。如果你想在3或4个数字之后允许空格,你需要这样写:

(\d{3}\s\d{4}|\d{4}\s\d{3}|\d{7})

此类号码的完整子正则表达式:

020\s?[378]\s?(\d{3}\s\d{4}|\d{4}\s\d{3}|\d{7})