RegExp заменить, если больше, чем 1 совпадение

Рейтинг: 0Ответов: 3Опубликовано: 13.02.2023

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

event.target.value.toString().replace(/[^0-9]\.,.{2}/g, '')

,.{2} вроде должно это работать, не понимаю, что не так

,.{2,} тоже пробовал и не получилось

Могу писать бесконечно точек и запятых. А нужна только точка или запятая. Если совпадение есть, то ни точку ни запятую больше писать нельзя. Как сделать так, чтобы можно было оставлять только одну точку или запятую? Поведение аналогичное с <input type="number">

UPDATE

Решение нашёл здесь: https://stackoverflow.com/questions/469357/html-text-input-allow-only-numeric-input

Ответы

▲ 1

В RegExp встроена "функция запоминания". То есть мы ищем какое-то совпадение, запоминаем его и дальше ищем по нему.
В примере ниже мы ищем символы . или ,, запоминаем и при нахождении этого символа ещё раз удаляем его.

const before = `,.,.,.,.,,......,,,,,..`;
console.log(`Before: '${before}'`); // Before: ',.,.,.,.,,......,,,,,..'
const after = before.replace(/(?<match>[,.])(?=.*\k<match>)/g, ``);
console.log(`After: '${after}'`); // After: ',.'

Подробнее об группах и обратных ссылок.


Вот как можно это реализовать как будто запрет ввода при повторе.
Попробуйте вводить несколько . или , в примере ниже:

const textareaTest = document.querySelector(`textarea#test`);
let before = textareaTest.value;
textareaTest.addEventListener(`beforeinput`, (event) => {
  before = textareaTest.value;
});
textareaTest.addEventListener(`input`, (event) => {
  if (/(?<match>[,.])(?=.*\k<match>)/g.test(textareaTest.value)) {
    textareaTest.value = before;
  }
});
<textarea id="test" placeholder="Повтори запятую если сможешь" rows="4" cols="40"></textarea>

▲ 1

Насколько я понял, то нужно не заменять значение, а не допускать некорректный ввод изначально. Тогда вопрос должен звучать, как "Ограничить ввод цифрами и одним разделителем" или "Имитация логики input с типом number".

numeric.addEventListener('beforeinput', function(ev) {
  if (['insertText', 'insertFromPaste', 'insertFromDrop'].includes(ev.inputType)) {
    if (!/^\d*[,.]?\d*$/.test(ev.data) || (/[,.]/g.test(ev.data) && /[,.]/g.test(this.value))) {
      ev.preventDefault();
      return false;
    }
  }
});
<input type="text" id="numeric">

▲ 0

В итоге вам нужно допускать только цифры и символы "." и ",", остальное удалить? и пробелы тоже?

.toString().replace(/[^.,0-9]/g, '')

.

А вот повторения между символами "." и "," я бы предложил сделать отдельным выражением, оставив только первое вхождение:

.toString().replace(/(\.|,)(\.|,)+/g, "$1")