не могу придумать регулярное выражение
Хочу проверить значение в поле регулярным выражением. Поле не обязательное для заполнения, в поле должно быть целое значение больше 0. Логика такая, если true, то вызывается ошибка, если false, то все норм валидация прошла.
console.log(h != '' && h != h.toString().replace(/[^1-9]/g, ''));
Пояснение:
h != '' - это я проверяю на необязательность заполнения, если не пустое, то true, если пустое? то false;
h != h.toString().replace(/[^1-9]/g, '') - тут я оставляю числа с 1 до 9 и проверяю, входящее значение не равно "обрезанному", если равно то false, если не равно то true
и тут возникла проблема, что при значениях кратных 10, выдается ошибка так как 0-и уходят в проверке поэтому я предположил, что может
console.log(h != '' && h != h.toString().replace(/[^0-9]/g, '') || h <= 0);
Но это тоже не вариант, так как теперь он пропускает 0.
Ответы (3 шт):
Автор решения: Sergey Mitrofanov
→ Ссылка
В своих загашниках нашел следующее.
const regex = /^(?!(?:^[-+]?[0.]+(?:[Ee]|$)))(?!(?:^-))(?:(?:[+-]?)(?=[0123456789.])(?:(?:(?:[0123456789]+)(?:(?:[.])(?:[0123456789]*))?|(?:(?:[.])(?:[0123456789]+))))(?:(?:[Ee])(?:(?:[+-]?)(?:[0123456789]+))|))$/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^(?!(?:^[-+]?[0.]+(?:[Ee]|$)))(?!(?:^-))(?:(?:[+-]?)(?=[0123456789.])(?:(?:(?:[0123456789]+)(?:(?:[.])(?:[0123456789]*))?|(?:(?:[.])(?:[0123456789]+))))(?:(?:[Ee])(?:(?:[+-]?)(?:[0123456789]+))|))$', 'gm')
const str = `0
123
456
00003
0.23
-0.1
23.1
-53.2
`;
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.log(`Found match, group ${groupIndex}: ${match}`);
});
}
Автор решения: newman
→ Ссылка
На ноль или отрицательные числа лучше проверять уже число полученное из строки. А перед этим отбросить варианты, когда в строке есть другие символы кроме цифр.
function checkStr(h) {
if (h == '') {
return false;
}
if (h != h.replace(/[^\d]+/g, '')) {
return false;
}
if (parseInt(h) <= 0) {
return false;
}
return true;
}
console.log("100 = " + checkStr('100'));
console.log("0 = " + checkStr('0'));
console.log("10 test = " + checkStr('10 test'));
console.log("-50 = " + checkStr('-50'));
console.log("test = " + checkStr('test'));
Автор решения: balamut
→ Ссылка
реализовал двумя способами: 1.
let regexp = /^[1-9]+\d*$/;
!(regexp.test(h));
onlyNums= new RegExp(/^[1-9]+\d*$/);
h.match(onlyNums) == null;