не могу придумать регулярное выражение

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

Хочу проверить значение в поле регулярным выражением. Поле не обязательное для заполнения, в поле должно быть целое значение больше 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.

Ответы

▲ 0

В своих загашниках нашел следующее.

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}`);
    });
}

▲ 0

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

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'));

▲ 0

реализовал двумя способами: 1.

let regexp = /^[1-9]+\d*$/;
!(regexp.test(h));
onlyNums= new RegExp(/^[1-9]+\d*$/);
h.match(onlyNums) == null;