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

Javascript jQuery正则表达式可以匹配数字,但不能匹配连字符,javascript,jquery,regex,Javascript,Jquery,Regex,所以,我想限制输入字段只允许数字和连字符。我不想改变我的方法,但想了解为什么我的正则表达式匹配数字而不是连字符 正则表达式: /[^0-9-]/g jsIDLE:唯一的方法是将连字符作为字符类中的第一个或最后一个字符,例如: [-0-9] or [0-9-] 但是,您使用的是否定字符类中所有内容的“^”,因此如果您只需要连字符和数字,则不应使用插入符号 来源:唯一的方法是将连字符作为字符类中的第一个或最后一个字符,如下所示: [-0-9] or [0-9-] 但是,您使用的是否定字符类中所

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

正则表达式:

/[^0-9-]/g

jsIDLE:

唯一的方法是将连字符作为字符类中的第一个最后一个字符,例如:

[-0-9] or [0-9-]
但是,您使用的是否定字符类中所有内容的
“^”
,因此如果您只需要连字符和数字,则不应使用插入符号


来源:

唯一的方法是将连字符作为字符类中的第一个最后一个字符,如下所示:

[-0-9] or [0-9-]
但是,您使用的是否定字符类中所有内容的
“^”
,因此如果您只需要连字符和数字,则不应使用插入符号


来源:

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

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:

因此,您的问题在于行
字符串。从charcode(e.which)

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

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:

因此,您的问题在于行
字符串。fromCharCode(e.which)

的问题在于
-
的keycode

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

});

问题在于
-
的键代码

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

});


请避开连字符。可能是/[^0-9\-]/g@Ethan最后一个连字符不需要转义。+1,因为这是一个好问题。以后,请尝试给出有问题的描述性代码。@SujithPS可以,谢谢。请转义连字符。可能是/[^0-9\-]/g@Ethan最后一个连字符不需要转义。+1,因为这是一个好问题。以后,尝试给出有问题的描述性代码。@SujithPS可以,谢谢。修复了添加两个选项的问题。代码可能有问题,但正则表达式本身会测试出来。正则表达式单独使用可能没问题,但如果它不能解决OP的问题,那么它就不是一个真正有效的答案。您的解决方案不应该只是指出问题的一部分,它应该完全回答问题的所有部分,并考虑到提供的完整代码。已经有一个可接受的答案,所以此时不需要。小提琴显示他们需要添加更多的键码。修复了添加两个选项的问题。您的代码可能有问题,但正则表达式本身进行了测试。正则表达式单独使用可能没问题,但如果它不能解决OP的问题,那么它就不是一个真正有效的答案。您的解决方案不应该只是指出问题的一部分,它应该完全回答问题的所有部分,并考虑到提供的完整代码。已经有一个可接受的答案,所以此时不需要。小提琴显示他们需要添加更多的键码。谢谢,接受你的答案,因为它提供了一个完整的解决方案。谢谢,接受你的答案,因为它提供了一个完整的解决方案。谢谢,你是对的+1,但接受了Sujith PS的回答,因为他提供了完整的解决方案。谢谢,你说得对+1,但接受了Sujith PS的回答,因为他提供了完整的解决方案。