У меня есть регулярное выражение в коде (написанном кем-то еще), я пытаюсь понять, что это означает.Нужно понимать некоторое регулярное выражение
var decimal = /^\d[0,1]+(\.\d[1,4])?$/;
Может кто-нибудь объяснить мне, что это делает ...
У меня есть регулярное выражение в коде (написанном кем-то еще), я пытаюсь понять, что это означает.Нужно понимать некоторое регулярное выражение
var decimal = /^\d[0,1]+(\.\d[1,4])?$/;
Может кто-нибудь объяснить мне, что это делает ...
В порядке:
^
- Матч начало ввода
\d
- цифра (0-9)
[0,1]+
- Один или несколько вхождений символов 0
, ,
или 1
— но примечание ниже, это, вероятно, не то, что автор имел в виду, чтобы сделать
(
- Началом захвата группы
\.
- буквальный .
(без обратной косой черты, это будет означать что-то особенное)
\d
- цифра
[1,4]
- Ровно один из персонажей 1
, ,
или 4
— но примечание ниже, это, вероятно, не то, что автор имел в виду, чтобы сделать
)
- Конец группы захвата
?
- Inidicates, что весь захват тентовый является опциональным (ноль или один раз)
$
- Сопоставьте конец ввода
Re в [0,1]+
и [1,4]
, выражение, вероятно, должен иметь {0,1}
и {1,4}
вместо, который означает:
{0,1}
- соответствует тому, что было до либо ноль или один раз (обратите внимание, что вы должны удалить +
, который был после [0,1]
)
{1,4}
- соответствует тому, что было до 1, 2, 3 или 4 раза
Here's an explanation on regex101.com
Если мы предполагаем, что они, вероятно, имел в виду this
/^\d{0,1}(\.\d{1,4})?$/
...то в прозе это означает: сопоставить любое число, которое может иметь или не иметь одну ведущую цифру, а затем может иметь или не иметь десятичную точку, за которой следует от одной до четырех цифр. Но у него все еще есть проблемы, не в последнюю очередь, что строка ""
соответствует ей, и (в зависимости от того, что вы делаете) вы, вероятно, хотите поддерживать значения, равные или превышающие 2
, чего нет у этого выражения.
В принципе: если оно предназначено для проверки десятичной дроби, выбросьте его и найдите что-то, что делает лучшую работу, например this, если вы действительно хотите не более четырех цифр точности и хотите захватить дробную часть (а оригинал делает):
/^(?:0|[1-9]\d*)(\.\d{1,4})?$/
Если вы хотите, чтобы любой уровень точности:
/^(?:0|[1-9]\d*)(\.\d+)?$/
Если вам не нужна группа захвата:
/^(?:0|[1-9]\d*)(?:\.\d{1,4})?$/ // Only allow 1-4 digits of precision
/^(?:0|[1-9]\d*)(?:\.\d+)?$/ // Allow any number of digits of precision
That last, вероятно, я бы с ним поехал. Обратите внимание, что он не позволяет вести нулевые записи, которые вы обычно не записывали (например, он запрещает 02.345
). Если вы хотите разрешить их, то просто /^\d*(?:\.\d+)?$/
.
Я думаю, что автор имел в виду подтверждение только десятичных значений, то число, т. Е. Число может быть либо натуральным числом, либо десятичным, но числом. , так он работает так. – kadamb
@kkk: Нет, не удаленно; см. выше. Если вы просто хотите проверить число, которое может быть '0',' 27', '0.143',' 241.33432', вам нужна одна из последних партий регулярных выражений выше (вероятно, они немного вне манжеты , но...). –
Решающие детали:
^
: Начало ввода
\d
: Цифра
[0,1]+
: Один или несколько вхождений 0
или 1
или ,
(\.\d[1,4])?
: Необязательное захват группа, содержащая: a .
буква, цифру и 1
или 4
или ,
$
: Конец ввода
Полный рассказ можно найти here.
Таким образом, некоторые разрешили вход:
, если я даю какое-либо значение, которое не имеет десятичной, оно возвращает нуль – kadamb
@AvinashRaj: Ах спасибо. Пришлось снять очки, но я вижу это сейчас. –
насчет объяснения [здесь] (https: // regex101.com/r/tY6mX7/1)? –
@PatrickHofman - я отмечал «regularexpression», «nsregularexpression», возможно, был помечен по ошибке. – kadamb
Я предполагаю, что они предполагали: '^ \ d {0,1} (\. \ D {1,4}) $', чтобы получить самые значащие десятичные числа некоторого числа с плавающей точкой меньше 10 и положительные. –