如何解决JS正则表达式在按键过程中不起作用的问题

How to solve JS Regex not working during keypress

提问人:mastersuse 提问时间:8/11/2023 最后编辑:Barmarmastersuse 更新时间:8/11/2023 访问量:70

问:

我有一些要求,如下所示:

  1. 最小字符数为 3,最大字符数为 8。
  2. 只接受大写字母和下划线。
  3. 前三 (3) 个字符必须为大写。

可接受的输入示例:“SAL”、“SAL_”、“SAL_G”

现在的问题:

  1. 如何控制用户必须用大写字母强制填写第一个三个字符?
  2. 在键盘上按下时不显示下划线

enter image description here

法典

$('#myInput').on("keypress", function(e) {
  var regex = new RegExp("^[A-Z]+(?:_[A-Z]+)*$")
  var str = String.fromCharCode(!e.charCode ? e.which : e.charCode);
  if (regex.test(str)) {
    return true;
  } else {
    return false;
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input class="form-control" type="text" id="myInput" minlength="3" maxlength="8">

JavaScript HTML jQuery 正则表达式

评论

0赞 Barmar 8/11/2023
不要用于静态正则表达式,它应该只在从变量动态创建它时使用。使用 RegExp 文本。new RegExp()
0赞 Barmar 8/11/2023
str只是用户键入的最后一个字符,而不是整个输入。为什么要使用多字符正则表达式来测试它?
0赞 Barmar 8/11/2023
要获取整个输入,请使用 .this.value
0赞 CAustin 8/11/2023
根据您的要求,我推荐使用正则表达式模式^[A-Z]{3}[A-Z_]{0,5}$
0赞 Barmar 8/11/2023
@CAustin 在这种情况下使用它的问题在于它不会让您输入前 2 个字符。keypress

答:

2赞 Mahesh Thorat 8/11/2023 #1

在这里,我基本上使用了事件,如果您使用,那么它将不适用于其他触摸键盘。inputkeypress

也不支持复制粘贴的内容,也检查这里keypress

因此,您可以尝试以下代码,让我知道这是否有帮助。

试试下面的片段

const inputElements = document.querySelectorAll("#myInput");
inputElements.forEach((inputElement) => {
  inputElement.addEventListener("input", function (event) {
    let inputText = event.target.value;
    let pregExpr = /[^A-Z]/g;
    if (inputText.length > 3) {
      pregExpr = /[^a-zA-Z]/g;
    }
    let sanitizedText = inputText.replace(pregExpr, "");
    if (sanitizedText.length > 2) {
      var trimmedString = sanitizedText.substring(0, 3);
      sanitizedText = trimmedString + "_" + sanitizedText.slice(3);
    }
    event.target.value = sanitizedText;
  });

  inputElement.addEventListener("keydown", (event) => {
    if (event.key === "Backspace") {
      let inputText = inputElement.value;
      if (inputText.endsWith("_")) {
        let newText = inputText.substring(0, inputText.length - 2);
        inputElement.value = newText;
      } else if (inputText.length > 0) {
        let newText = inputText.substring(0, inputText.length - 1);
        inputElement.value = newText;
      }
      event.preventDefault();
    }
  });
});
<input class="form-control" type="text" id="myInput" minlength="3" maxlength="8">

旧代码版本

const inputElements = document.querySelectorAll("#myInput");
inputElements.forEach((inputElement) => {
  inputElement.addEventListener("input", function (event) {
    const inputText = event.target.value;
    let pregExpr = /[^A-Z]/g;
    if (inputText.length > 3) {
      pregExpr = /[^a-zA-Z]/g;
    }
    let sanitizedText = inputText.replace(pregExpr, "");
    if (sanitizedText.length > 2) {
      var trimmedString = sanitizedText.substring(0, 3);
      sanitizedText = trimmedString + "_" + sanitizedText.slice(3);
    }
    event.target.value = sanitizedText;
  });
});
<input class="form-control" type="text" id="myInput" minlength="3" maxlength="8">

评论

0赞 mastersuse 8/11/2023
嗨,只是想知道,如果用户错误地输入了信息,如何删除(退格)输入的下划线和前面的字符。我只能删除下划线后面的字符。
0赞 Mahesh Thorat 8/11/2023
@mastersuse我更改了代码。请看一次
0赞 mastersuse 8/11/2023
对不起,打扰了,新代码接受整数,符号?:-D
0赞 Mahesh Thorat 8/11/2023
是的,错过了一个案例,现在尝试上面的代码@mastersuse