正则表达式只输入允许的模式(输入文本)

时间:2018-05-04 09:25:35

标签: javascript regex input regex-negation regex-group

我有一个输入文本字段,我想允许一个模式输入示例:

hd546648 -ok

Vg315248 - 确定> 2个字符可以是字母(小写,大写)和6个字符唯一的数字

on("input", "test", function(event) {
const invalidChars = /^[^A-Za-z]{1,2}\D{1,6}$/g;
ob = event.target;
if (invalidChars.test(ob.value)) {
  ob.value = ob.value.replace(invalidChars, "");
}
});

如果我只使用它/^[^A-Za-z]{1,2}/g;它的工作,我只能在文本框中输入字母,但如果我添加数字部分,那就错了。

我想要做的是,如果我在输入框中输入,替换任何不是A-Z或a-z的字符,前2,并替换任何其他不是0-9的字符为3-8。因此,对于前2个仅启用字母,而3到8仅启用数字。

2 个答案:

答案 0 :(得分:1)

在整个事情上使用正则表达式将不起作用,因为每个验证都可以使输入的另一部分无效。此解决方案依次检查每个字符,并截断为最后一个有效字符的长度。在这里小提琴:https://jsfiddle.net/spwe4k21/

$(function() {
  $("#submit").attr("disabled", true);

  $("#userinput").keyup(function() {
    let input = $(this).val();
    let cleanedInput = cleanInput(input);
    $(this).val(cleanedInput);

  });
});

function cleanInput(input) {
  let tests = [/[a-z]/i, /[a-z]/i, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/];
  for (let i = 0; i < tests.length; i++) {
    if (input[i] == undefined || !tests[i].test(input[i])) {
      return input.substring(0, i);
    }
  }

  return input.substring(0, tests.length);
}

答案 1 :(得分:0)

您可以将字符串拆分为具有这两个独立的部分,以便在两个部分上执行替换:

<强>更新

&#13;
&#13;
document.getElementById("re").onkeypress = function (e) {
  var keys = [8, 46, 37, 38]
  if (!keys.includes(e.keyCode))
    if (!/^[a-z]([a-z]\d{0,6})?$/i.test(e.target.value + e.key))
      e.preventDefault();
};
&#13;
<input id="re" placeholder="Type something">
&#13;
&#13;
&#13;