#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/12. @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