正则表达式允许在模式中未指定的字符?

时间:2016-09-26 13:46:06

标签: javascript regex

我需要确保表单上的字段包含字母数字字符。零到九,A到Z.没有标点符号,没有特殊字符,没有别的。

我有以下方法:

function foo()
{
    var pStrValue = mTrim($('#txtIDNumber').val());

    var regexFirstChar = new RegExp("^[A-Z0-9]{1}"); //First character is alphanumeric
    var regexNum = new RegExp("^[0-9]{9}.{0,3}$"); // First 9 are numeric
    var regexLetter1 = new RegExp("^[A-Z]{1,3}[0-9]{6}$"); //Up to the first 3 are alpha, then there are exactly 6 numbers
    var regexLetter2 = new RegExp("^[A-Z]{1,3}[0-9]{9}$"); //Up to the first 3 are alpha, then there are exactly 9 numbers

    var firstCharIsNum = !isNaN(pStrValue.charAt(0));

    if (!regexFirstChar.test(pStrValue)) //If the first character isn't alphanumeric
        return false;
    else if (firstCharIsNum) 
    {
        //this is the conditional that evaluates to true incorrectly
        if (!regexNum.test(pStrValue)) //If the first character is a number and is not proceeded by 8 more digits
            return false;
    }
    else if (!firstCharIsNum) 
    {
        if (!regexLetter1.test(pStrValue) && !regexLetter2.test(pStrValue)) //If the first 1-3 characters are letters and are not proceed by exactly 6 or 9 digits
            return false;
    }

    return true;
}

问题是这是接受特殊字符。我将1234567890”,’”输入文本框,然后通过验证。

我在一年前写过这篇文章,当时它肯定有用(或者我想也许QA错过了这个),但从那时起我们的应用程序已经进行了重要的重写。在任何一种情况下,正则表达式绝对不是我的强项。为什么这允许使用特殊字符?

4 个答案:

答案 0 :(得分:1)

如果我正确理解了您的目标,问题出在您的行中:

var regexNum = new RegExp("^[0-9]{9}.{0,3}$");

.允许任意字符在0到3次之间。至少,您需要将其转义为\. - 但我认为您真正想要的是(小数点前九位数,后三位数):

var regexNum = new RegExp("^[0-9]{9}\.[0-9]{0,3}$");

答案 1 :(得分:1)

你的regexNum允许(在9个数字之后)最多3个字符,无论如何:

var regexNum = new RegExp("^[0-9]{9}.{0,3}$");

所以你可以简单地删除这个部分,它只允许9个数字

var regexNum = new RegExp("^[0-9]{9}$");

在这里你可以测试一下: http://regexr.com/3eaa5

编辑:在9个数字后面有3个可选的字母数字值(大写或小写),它将是:

var regexNum = new RegExp("^[0-9]{9}[A-Z0-9]{0,3}$");

答案 2 :(得分:1)

如果我打算你的问题regexNum测试字符串是否由 9位 + 0-3个字母数字字符组成 [0-9A-Z] 。如果是这样的话:

var regexNum = new RegExp("^[0-9]{9}[0-9A-Z]{0,3}$"); // First 9 are numeric + 0-3 of any alphanumeric characters, end of string.

根据您的要求,这不允许使用标点,没有特殊字符,只需0-9和A-Z。

答案 3 :(得分:1)

您可以使用以下RegEx

var regularExp = new RegExp("^[0-9]{0,9}.{0,3}$");

阐释:

^ assert position at start of the string
[0-9]{0,9} match a single character between 0 to 9
$ assert position at end of the string