Я хочу автоматически удалить все символы, которые не соответствуют шаблону при вводе. Сначала я попробовал использовать «^» (пример: «[a-z]{2,2}» будет преобразовано в «[^a-z]*»), но это сработало только для некоторых входных данных.
Вот мой код:
$("input:not([ignore-pattern-check])[pattern]").on("input", function(){
let val = $(this).val();
if (val.length >= 1){
var regex = $(this).attr("pattern");
if (regex.charAt(0) == "^"){
regex = regex.substr(1, regex.length);
}
if (regex.charAt(regex.length - 1) == "$"){
regex = regex.substr(0, regex.length - 1);
}
regex = regex.replace(/\{(.+?)\}/, "*");
regex = "^(?!.*(" + regex + "))$";
let reg = new RegExp(regex);
if (reg.test(val)){
alert("This char isn't allowed!");
} else {
_hide_message();
}
$(this).val(val.replace(reg, ""));
}
});
РЕДАКТИРОВАТЬ
Пример:
У меня есть вход с pattern = "^[a-z]*$". Когда я сейчас набираю «A» (с учетом регистра), эта «A» должна автоматически удаляться из значения. Когда я набираю «а», его не следует удалять.
Не работает. Я изменил это на это: $(this).val(val.split(/$(this).attr("pattern")/).join("")).
Я предложил использовать шаблон регулярное выражение внутри .split, а не какой-то код внутри разделителей. $(this).val(val.split($(this).attr("pattern")).join(""))если $(this).attr("pattern") является RegExp объектом. Если $(this).attr("pattern") не является объектом RegExp, используйте new RegExp($(this).attr("pattern")).
Шаблон ^[a-z]$ означает 1 строчную букву, поэтому AB недействителен, если вы перевернете его, вы сможете ввести AB, не так ли?
Я хотел бы, чтобы вы могли объяснить это более простыми словами. Попытка удержать в голове информацию о мега-регулярных выражениях, а затем расшифровывать то, что вы имеете в виду, — это уже слишком.
@ Тото Извини, я имел в виду [a-z]. Я сделал быстрый пример.
Вы не можете «инвертировать» любой шаблон универсальным способом. То, что я предложил, справедливо для простых незакрепленных шаблонов.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете попробовать приведенный ниже код — работает, используя решение из комментария выше.
const update = () => {
const regex = document.getElementById("regex").value;
const input = document.getElementById("input").value;
const result = input.match(new RegExp(regex, 'g')).join('X');
console.info("result", result);
document.getElementById("output").innerHTML = result;
}<label for = "regex">Regex</label><input name = "regex" id = "regex" type = "text" value = "[a-z ]+"><br>
<label for = "input">Input</label><input name = "input" id = "input" type = "text" value = "only Small Letters allowed, no _ underscores etc:)"><br>
<button onclick = "update()">Run</button>
<br>
<div id = "output"></div>Я думаю, что не очень хорошо выразился, поэтому я сделал правку. Это не работает для меня. Извиняюсь.
Сделал небольшое обновление - не знаю, имеет ли это значение, хотя
Попробуйте так:
$(this).val(val.split(/your_pattern/).join(""))вместо всегоifблока.