Регулярное выражение: целое, или десятичное, Или дробное

#javascript #regex

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

Вопрос:

Можно ли в 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*)?$
  

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

Спасибо!

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

1.Попробуйте добавить чередование, где оба конца косой черты должны начинаться с цифры 1-9 ^(?:(?:0|[1-9]d*)(?:[.,]d*)?|[1-9]d*/[1-9]d*)$ regex101.com/r/LOrMHp/1

2. @anubhava мы не хотим допускать более одного начального нуля в десятичных числах

Ответ №1:

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

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

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

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

Демонстрация регулярных выражений

 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:

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

 /^(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