【问题标题】:Javascript regex for numbers only is accepting # $ % & (仅用于数字的 Javascript 正则表达式接受 # $ % & (
【发布时间】:2015-08-18 11:24:59
【问题描述】:


我正在尝试在 javascript 中正则表达式输入字段。 我所做的是,每次按下一个键时,都会调用以下代码:

function testPattern(pattern, evt) {
    // in this case, pattern = "^[0-9]*$"
    var inputField = evt.getCurrentTarget();
    var keyCode = evt.getKeyCode();
    var oldValue = inputField.getSubmittedValue();

    // return if keycode is navigation, delete or backspace
    if((keyCode >= 35 && keyCode <= 40) || keyCode == 8 || keyCode == 46){
        return;
    }

    var regExp = new RegExp(pattern);
    var hasMatch = false;

    hasMatch = regExp.test(String.fromCharCode(keyCode));

    if (!hasMatch) {
        inputField.setValue(oldValue);
        evt.cancel();
    }
}

预期结果是:如果输入与数字不同,则输入文本框中不会写入任何字符。 它工作正常,除了字符 # $ % & (
我尝试了以下正则表达式(非常相似)

"^[\\d]$"
"^[\\d]*$"
"^[\\d]+$"
"^[0-9]*$"

有人知道为什么会发生这种情况吗?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您的正则表达式没有任何问题。

    问题出在

    // return if keycode is navigation, delete or backspace
    if((keyCode >= 35 && keyCode <= 40) || keyCode == 8 || keyCode == 46)
        return;
    

    如果您查看 ascii 表,您会看到:

    8     backspace
    35    #
    36    $
    37    %
    38    &
    39    ´
    40    (
    46    .
    

    您的问题来自您正在收听的浏览器实现/键盘事件中的 keyCode 和 charCode 之间的混淆:

    这个问题可能是一个很好的阅读:keycode and charcode

    【讨论】:

    【解决方案2】:

    以这种方式使用正则表达式:

    /^\d+$/
    

    【讨论】:

    • 它仍然会发生.. 这和我用过的完全一样。我认为这是一种非常奇怪的行为..
    【解决方案3】:

    限制此 ASCII 35,36,37,38,39,40 以限制这些符号,或者您可以使用下面提到的代码。

    <script type="text/javascript">
    
        var specialKeys = new Array();
        specialKeys.push(8); //Backspace
        specialKeys.push(9); //Tab
        specialKeys.push(46); //Delete
        specialKeys.push(36); //Home
        specialKeys.push(35); //End
        specialKeys.push(37); //Left
        specialKeys.push(39); //Right
    
        function IsAlphaNumeric(e) {
            var keyCode = e.keyCode == 0 ? e.charCode : e.keyCode;
            var ret = ((keyCode >= 32 && keyCode <= 32)||(keyCode >= 44 && keyCode <= 44)||(keyCode >= 46 && keyCode <= 46)||(keyCode >= 48 && keyCode <= 57) || (keyCode >= 65 && keyCode <= 90) || (keyCode >= 97 && keyCode <= 122) || (specialKeys.indexOf(e.keyCode) != -1 && e.charCode != e.keyCode));
            document.getElementById("error").style.display = ret ? "none" : "inline";
            return ret;
        }
    </script>
    

    【讨论】:

      猜你喜欢
      • 2012-11-23
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多