Regex让我很困惑,为什么会赢'它不能正确解析

Regex is confusing me and why won't it parse properly?

本文关键字:不能 为什么 Regex      更新时间:2023-09-26

很抱歉标题混淆了。我是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);
    }
});

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

正则表达式有几个问题。

  1. 您要替换与列表不匹配的字符。要做到这一点,您可以用^开始您的角色类([])。

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

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

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

这导致了一个看起来像这样的正则表达式:

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

这个fiddle展示了上面的正则表达式的工作:http://jsfiddle.net/WyttT/

已更新

您遇到的另一个问题是由检查keydown事件中的密钥代码引起的。keydown上的键代码与实际的ascii字符代码不匹配,因此非字母数字键被转换为奇怪的字符。如果您将偶数处理程序改为响应keypress,您将获得更好的结果。

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

你有个性。您有一个匹配或不匹配的字符列表。charAt()可以简单有效地完成此操作。

既然jcsanyi已经帮助您使用regex,下面是对JS代码的简化。Codepen

您需要使用keypress而不是keydown/keyup,否则您的numpad将返回错误的键,并且任何需要移位的键(例如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);
  }
});