正则表达式令我困惑,为什么它不能正确解析?

时间:2013-06-22 03:12:41

标签: javascript jquery regex

对于令人困惑的标题感到抱歉。我是Regex和JS / JQ的新手。但是,我正在尝试解析这个问题。基本上,如果按键0-9和键+, - ,/和*按下,我希望它将按键添加到HTML中。任何帮助将非常感激。这是我的代码:

function charCode(code) {
    return String.fromCharCode(code);
}

function escapeChars(esc) {
    return esc.replace(/[0-9\+-\*\/]*$/, "");
}

$('#tb').html("0");
$(document).on("keydown", function(event) {

    var div = $('#tb');
    var which = event.which;
    which = charCode(which);
    which = escapeChars(which);
    else if (div.html() == "0") {
        //alert("Div is equal to 0."); --Debug
        div.html(which);
    } else {
        //alert("Div is equal to " + div.html()); --Debug
        div.html(div.html() + which);
    }
});

目前,它不允许任何通过。

3 个答案:

答案 0 :(得分:4)

你的正则表达式存在一些问题。

  1. 您想要替换与您的列表匹配的字符。为此,您可以使用[]开始角色课程(^)。

  2. 您无需在正则表达式中转义+*。您确实需要将-移到开头或结尾。

  3. 在字符类之后,您不需要*$。删除那些,你将替换任何不匹配的字符,无论它出现在字符串中的什么位置。

  4. 如果您的字符串包含多个字符(此处可能不适用),则在末尾添加g标记将允许您替换所有字符匹配。

  5. 这会产生一个如下所示的正则表达式:

    /[^0-9+*\/-]/g
    

    这个小提琴显示上述正则表达式:http://jsfiddle.net/WyttT/

    更新

    您遇到的另一个问题是检查keydown事件中的密钥代码。 keydown do not match to actual ascii character codes上的密钥代码,因此非字母数字键会转换为奇怪的字符。如果您更改偶数处理程序以响应keypress,则会获得更好的结果。

答案 1 :(得分:1)

我不认为你想要一个正则表达式。我认为charAt()会更简单地做你想做的事。

你有一个角色。您有一个与之匹配或不匹配的字符列表。 charAt()简单有效地做到了。

答案 2 :(得分:1)

现在jcsanyi已经帮助你使用了正则表达式,这里简化了你的JS代码。 Codepen

您将需要使用keypress而不是keydown / keyup,否则您的小键盘将返回错误的键,并且任何需要移位的内容(例如shift+8 = *)将无效。您还可以使用RegExp.test(String)检查字符是否有效,并使用div.append(char)代替div.html(div.html + char)

var div = $('#tb');
$(document).on("keypress", function(event) {
  var char = String.fromCharCode(event.which);
  if (/[0-9+*\/-]/.test(char) === true) {
    div.append(char);
  }
});