jQuery正则表达式可以匹配数字,但不匹配连字符

时间:2014-01-17 14:12:30

标签: javascript jquery regex

所以,我想将输入字段限制为仅允许数字和连字符。我对改变我的方法不感兴趣,但是想了解为什么我的正则表达式匹配数字而不是连字符。

正则表达式:

/[^0-9-]/g

jsFiddle:http://jsfiddle.net/abriggs/7G6JD/

3 个答案:

答案 0 :(得分:2)

添加简单的控制台行将显示错误

function numbersOnly(number, allowDash) {
    console.log("In numbersOnly);
    // Filter non-digits/dash from input value.
    if (allowDash) { 
        console.log("1:", number);
        number = number.replace(/[^0-9\-]/g, '');
        console.log(2:", number);
    } else {
        // Filter non-digits from input value.
        number = number.replace(/\D/, '');
    }
    return number;
}

输入1

In numbersOnly
1: 1
2: 1

输入-

In numbersOnly
1: ½ 
2:

所以问题在于行String.fromCharCode(e.which)

答案 1 :(得分:2)

问题出在-

的密钥代码上

keycode of - is 189 or 109 .

但是   String.fromCharCode(189)½

String.fromCharCode(109)m

您可以使用以下代码:

function numbersOnly(number, allowDash) {
    // Filter non-digits/dash from input value.
    console.log(number);
    if (allowDash) {
        number = number.replace(/[^0-9\-]/g, '');
    } else {
        // Filter non-digits from input value.
        number = number.replace(/\D/, '');
    }
    return number;
}

$(function(){

    // Do not allow non-numeric characters in bill zip code
    $('#billZip').keydown(function(e) {
        console.log(e.keyCode);
        if (e.keyCode != 8 && e.keyCode != 37 && e.keyCode != 39) {
              if(e.keyCode ===189||e.keyCode ===109)
                 if (numbersOnly(String.fromCharCode(45), true) != "")
                    return true;
                 else 
                     return false

            if (numbersOnly(String.fromCharCode(e.which), true) != "")
                return true;
            else return false
        }
    });

});

<强> Fiddle

答案 2 :(得分:0)

执行此操作的唯一方法是将连字符作为字符类中的 FIRST LAST 字符,例如:

[-0-9] or [0-9-]

但是,您正在使用"^"来否定字符类中的所有内容,因此如果您只想要连字符和数字,则不应该使用插入符号。

来源:http://www.regular-expressions.info/charclass.html