Я хочу получить regexp
, чтобы разрешить следующие форматы цен ниже (это нить в форме)
РАЗРЕШАТЬ
[0-9]
1 и более раз)
НЕ ДОПУСКАТЬ
Пока я получил это:
/^[0-9]+(,[0-9][0-9]?)?$/
Кажется, это работает. Но действительно ли он делает то, что я хочу?
const priceRegex = /^[0-9]+(,[0-9][0-9]?)?$/;
const span1 = document.getElementById('span1');
const span2 = document.getElementById('span2');
const span3 = document.getElementById('span3');
const span4 = document.getElementById('span4');
const span5 = document.getElementById('span5');
const span6 = document.getElementById('span6');
const span7 = document.getElementById('span7');
const span8 = document.getElementById('span8');
const span9 = document.getElementById('span9');
const span10 = document.getElementById('span10');
const span11 = document.getElementById('span11');
const span12 = document.getElementById('span12');
const span13 = document.getElementById('span13');
span1.innerHTML = priceRegex.test('5') ? ' IS VALID' : ' IS NOT VALID';
span2.innerHTML = priceRegex.test('5,5') ? ' IS VALID' : ' IS NOT VALID';
span3.innerHTML = priceRegex.test('5,55') ? ' IS VALID' : ' IS NOT VALID';
span4.innerHTML = priceRegex.test('5,') ? ' IS VALID' : ' IS NOT VALID';
span5.innerHTML = priceRegex.test('5,555') ? ' IS VALID' : ' IS NOT VALID';
span6.innerHTML = priceRegex.test('5,5555') ? ' IS VALID' : ' IS NOT VALID';
span7.innerHTML = priceRegex.test('a') ? ' IS VALID' : ' IS NOT VALID';
span8.innerHTML = priceRegex.test('5a') ? ' IS VALID' : ' IS NOT VALID';
span9.innerHTML = priceRegex.test('a5') ? ' IS VALID' : ' IS NOT VALID';
span10.innerHTML = priceRegex.test('a,5') ? ' IS VALID' : ' IS NOT VALID';
span11.innerHTML = priceRegex.test('5,a') ? ' IS VALID' : ' IS NOT VALID';
span12.innerHTML = priceRegex.test('a5,5') ? ' IS VALID' : ' IS NOT VALID';
span13.innerHTML = priceRegex.test('5a,5') ? ' IS VALID' : ' IS NOT VALID';
div {
color: black;
}
span {
color: blue;
}
.notValid {
color: red;
}
<div>5<span id = "span1"></span><div>
<div>5,5<span id = "span2"></span></div>
<div>5,55<span id = "span3"></span></div>
<br/>
<div>5,<span id = "span4" class = "notValid"></span><div>
<div>5,555<span id = "span5" class = "notValid"></span></div>
<div>5,5555<span id = "span6" class = "notValid"></span></div>
<div>a<span id = "span7" class = "notValid"></span></div>
<div>5a<span id = "span8" class = "notValid"></span></div>
<div>a5<span id = "span9" class = "notValid"></span></div>
<div>a,5<span id = "span10" class = "notValid"></span></div>
<div>5,a<span id = "span11" class = "notValid"></span></div>
<div>a5,5<span id = "span12" class = "notValid"></span></div>
<div>5a,5<span id = "span13" class = "notValid"></span></div>
Спасибо! Я не хочу допускать пробелов и отрицательных значений. Просто нужно соответствовать формату целого числа с 0, 1 или 2 десятичными знаками. То, что я получил до сих пор, достаточно хорошо?
Да, так и должно быть. Единственная проблема незначительный, которую я вижу, это 5,0
и 5,00
- если вы считаете их действительными и не требуете их усечения, тогда все в порядке.
Спасибо! Они хороши в обоих направлениях. Обрезанный или нет. Я конвертирую в число с parseFloat()
перед сохранением в базе данных.
предостережение - parseFloat
не нравится запятая. Он ожидает точку, поэтому вам может потребоваться заменить его перед синтаксическим анализом.
Ты прав. Спасибо тебе за это! Сделает это немедленно.
Ваше регулярное выражение работает нормально, ничего не меняйте.
Здесь мы, вероятно, начнем с двух простых выражений, а затем соединим их с помощью логического ИЛИ, возможно, что-то вроде:
^[0-9]+$|^[0-9]+,[0-9]{1,2}$
const regex = /^[0-9]+$|^[0-9]+,[0-9]{1,2}$/gm;
const str = `5
5,5
5,55
5,
5,555
5,5555
a
5a
a5
a,5
5,a
a5,5
5a,5`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.info(`Found match, group ${groupIndex}: ${match}`);
});
}
jex.im визуализирует регулярные выражения:
Если это выражение не нужно, его можно модифицировать/изменить в regex101.com.
Он работает... в том смысле, что он соответствует требованиям, которые вы выдвинули. Я не знаю, есть ли другие ситуации, которые могут сбить ваше регулярное выражение, например, может ли быть пробел перед числом? После номера? Может ли быть отрицательное значение
-1,23
? Можно+1,23
? Можно ли1.23
- с точкой? Что произойдет, если цена равна нет, но совпадает с форматом?