Регулярное выражение, позволяющее использовать значения от 0 до 365 с десятичными знаками, но 365 должно содержать все десятичные цифры только как 0

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Я пытаюсь создать регулярное выражение, позволяющее использовать значения от 0 до 365 с необязательными десятичными дробями, но 365 должно содержать все необязательные десятичные цифры только как 0.

 ^(0?[0-9]?[0-9]|[1-2][0-9][0-9]|3[0-5][0-9])(.d )|(36[0-5])(.[0] )?$
  

Это принимает только 365 и 365, за которыми следуют десятичные знаки, такие как (365.0, 365.00), но оно принимает только десятичные числа 1.0, 10.0, 100.0, а не без десятичных знаков 1,10,100 не уверен, что происходит. буду признателен за любую помощь.

Комментарии:

1. (?:[12]?d{1,2}|3[0-5]d|36[0-4])(?:.d )?|365(?:.0 )?

2. Правильным ответом было бы: сопоставьте все возможные цифры и сравните их программно. Хотя это возможно с помощью регулярных выражений, это, скорее всего, не поддерживается, и вы наверняка забудете значение через пару недель.

3. Похоже, что регулярное выражение здесь является неправильным решением, где и зачем вам нужно это регулярное выражение? Почему бы просто не использовать что-то вроде Number.isNaN(Number.parseFloat(value)) amp;amp; value < 365 и т.д.?

Ответ №1:

Либо используйте (см. демонстрацию на regex101.com )

 ^(?:d|[1-9]d|[12]d{2}|3[0-5]d|36[0-4]|365.0*)(?:.d )?$
  

Или (лучше!):

 ^d (?:.d )?$
  

и впоследствии программно сравнивать значения.
Последнее может быть:

 let data = `0.00
123.2121212
365.00
365.11
-1000
299
1000
365.1`;

let regex = /^d (?:.d )?$/gm;
while (found = regex.exec(data)) {
    number = parseFloat(found[0]);
    if (number >= 0 amp;amp; number <= 365) {
        console.log(number   " ("   found[0]   ")");
    }
}