提问人:mastersuse 提问时间:8/11/2023 最后编辑:Barmarmastersuse 更新时间:8/11/2023 访问量:70
如何解决JS正则表达式在按键过程中不起作用的问题
How to solve JS Regex not working during keypress
问:
我有一些要求,如下所示:
- 最小字符数为 3,最大字符数为 8。
- 只接受大写字母和下划线。
- 前三 (3) 个字符必须为大写。
可接受的输入示例:“SAL”、“SAL_”、“SAL_G”
现在的问题:
- 如何控制用户必须用大写字母强制填写第一个三个字符?
- 在键盘上按下时不显示下划线
法典
$('#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">
答:
2赞
Mahesh Thorat
8/11/2023
#1
在这里,我基本上使用了事件,如果您使用,那么它将不适用于其他触摸键盘。input
keypress
也不支持复制粘贴的内容,也检查这里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
评论
new RegExp()
str
只是用户键入的最后一个字符,而不是整个输入。为什么要使用多字符正则表达式来测试它?this.value
^[A-Z]{3}[A-Z_]{0,5}$
keypress