RegExp заменить, если больше, чем 1 совпадение
Мне нужно проверять строку и, если там больше одной запятой или точки, удалять дополнительные. Ну и разрешить только числа, это работает.
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
Ответы (3 шт):
В итоге вам нужно допускать только цифры и символы "." и ",", остальное удалить? и пробелы тоже?
.toString().replace(/[^.,0-9]/g, '')
.
А вот повторения между символами "." и "," я бы предложил сделать отдельным выражением, оставив только первое вхождение:
.toString().replace(/(\.|,)(\.|,)+/g, "$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>
Насколько я понял, то нужно не заменять значение, а не допускать некорректный ввод изначально. Тогда вопрос должен звучать, как "Ограничить ввод цифрами и одним разделителем" или "Имитация логики 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">