2014-12-16 4 views
1

У меня есть регулярное выражение в коде (написанном кем-то еще), я пытаюсь понять, что это означает.Нужно понимать некоторое регулярное выражение

var decimal = /^\d[0,1]+(\.\d[1,4])?$/; 

Может кто-нибудь объяснить мне, что это делает ...

+3

насчет объяснения [здесь] (https: // regex101.com/r/tY6mX7/1)? –

+0

@PatrickHofman - я отмечал «regularexpression», «nsregularexpression», возможно, был помечен по ошибке. – kadamb

+0

Я предполагаю, что они предполагали: '^ \ d {0,1} (\. \ D {1,4}) $', чтобы получить самые значащие десятичные числа некоторого числа с плавающей точкой меньше 10 и положительные. –

ответ

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+)?$/.

+0

Я думаю, что автор имел в виду подтверждение только десятичных значений, то число, т. Е. Число может быть либо натуральным числом, либо десятичным, но числом. , так он работает так. – kadamb

+0

@kkk: Нет, не удаленно; см. выше. Если вы просто хотите проверить число, которое может быть '0',' 27', '0.143',' 241.33432', вам нужна одна из последних партий регулярных выражений выше (вероятно, они немного вне манжеты , но...). –

2

Решающие детали:

^: Начало ввода

\d: Цифра

[0,1]+: Один или несколько вхождений 0 или 1 или ,

(\.\d[1,4])?: Необязательное захват группа, содержащая: a . буква, цифру и 1 или 4 или ,

$: Конец ввода

Полный рассказ можно найти here.

Таким образом, некоторые разрешили вход:

  • 80,94
  • 41111111,44
  • 4 ,,, 1,44
+0

, если я даю какое-либо значение, которое не имеет десятичной, оно возвращает нуль – kadamb

+0

@AvinashRaj: Ах спасибо. Пришлось снять очки, но я вижу это сейчас. –

Смежные вопросы