Можно ли в JavaScript проверить, является ли какой-либо ввод целым числом ИЛИ десятичным (с использованием точек или запятых в качестве разделителя) ИЛИ дробью (без использования нулей в числителе или знаменателе) с помощью одного регулярного выражения?

Примеры допустимых входных данных:

1
2
1.5
2,5
111.422
0,5
1/2
3/4

И т.п.

Недействительные вводы

00,5
00.5
0/1
1/0

И т.п.

Пока что я использую это для десятичной части:

^(0|[1-9]\d*)([\.,]\d*)?$

Но у меня проблемы с объединением его с дробной частью. Я не знаю, возможно ли это даже с одним регулярным выражением без использования какого-либо дополнительного управления потоком.

Спасибо!

0
Carlos 2 Сен 2020 в 13:03

2 ответа

Лучший ответ

Вы можете добавить чередование, в котором числитель или знаменатель начинаются с цифры 1-9.

Если, например, 3. также недействителен, вы можете повторить цифры 1+ раз в этой части (?:[.,]\d+)?

Обратите внимание, что вам не нужно экранировать точку в классе символов.

^(?:(?:0|[1-9]\d*)(?:[.,]\d+)?|[1-9]\d*\/[1-9]\d*)$

Regex demo

let pattern = /^(?:(?:0|[1-9]\d*)(?:[.,]\d+)?|[1-9]\d*\/[1-9]\d*)$/;
["1",
  "2",
  "1.5",
  "2,5",
  "111.422",
  "0,5",
  "1/2",
  "3/4",
  "00,5",
  "00.5",
  "0/1",
  "1/0"
].forEach(s => console.log(`${s} --> ${pattern.test(s)}`))
2
The fourth bird 2 Сен 2020 в 10:28

Я думаю , что это надежно:

/^(0?([1-9][0-9]*)?([\.,])?0?([1-9][0-9]*)?|[1-9]+\/[1-9]+)$/

Примере:

let foo = [
    '1',
    '2',
    '1.5',
    '2,5',
    '111.422',
    '0,5',
    '1/2',
    '3/4',
    '00,5',
    '00.5',
    '0/1',
    '1/0'
];
foo.forEach(val => {
    console.log(val, /^(0?([1-9][0-9]*)?([\.,])?0?([1-9][0-9]*)?|[1-9]+\/[1-9]+)$/.test(val));
});

Дает

1 true
2 true
1.5 true
2,5 true
111.422 true
0,5 true
1/2 true
3/4 true
00,5 false
00.5 false
0/1 false
1/0 false
1
Mitya 2 Сен 2020 в 10:30