Javascript/jQuery Инвертировать регулярное выражение программно

Я хочу автоматически удалить все символы, которые не соответствуют шаблону при вводе. Сначала я попробовал использовать «^» (пример: «[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(/your_pattern/).join("")) вместо всего if блока.

Wiktor Stribiżew 03.06.2019 18:48

Не работает. Я изменил это на это: $(this).val(val.split(/$(this).attr("pattern")/).join("")).

Myzel394 03.06.2019 18:55

Я предложил использовать шаблон регулярное выражение внутри .split, а не какой-то код внутри разделителей. $(this).val(val.split($(this).attr("pattern")).join(""))если $(this).attr("pattern") является RegExp объектом. Если $(this).attr("pattern") не является объектом RegExp, используйте new RegExp($(this).attr("pattern")).

Wiktor Stribiżew 03.06.2019 18:56

Шаблон ^[a-z]$ означает 1 строчную букву, поэтому AB недействителен, если вы перевернете его, вы сможете ввести AB, не так ли?

Toto 03.06.2019 19:10

Я хотел бы, чтобы вы могли объяснить это более простыми словами. Попытка удержать в голове информацию о мега-регулярных выражениях, а затем расшифровывать то, что вы имеете в виду, — это уже слишком.

user557597 03.06.2019 19:16

@ Тото Извини, я имел в виду [a-z]. Я сделал быстрый пример.

Myzel394 03.06.2019 19:17

Вы не можете «инвертировать» любой шаблон универсальным способом. То, что я предложил, справедливо для простых незакрепленных шаблонов.

Wiktor Stribiżew 03.06.2019 19:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать приведенный ниже код — работает, используя решение из комментария выше.

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>

Я думаю, что не очень хорошо выразился, поэтому я сделал правку. Это не работает для меня. Извиняюсь.

Myzel394 03.06.2019 19:05

Сделал небольшое обновление - не знаю, имеет ли это значение, хотя

Rainer Plumer 03.06.2019 19:20

Другие вопросы по теме