Regex для плавающей запятой?

Я пытаюсь написать RegEx для проверки числа с плавающей запятой. Вот что мне удалось:

/^[-+]?[1-9]\d{0,2}(\.\d{1,1})?/

Номер действителен, если:

  • Либо положительный, либо отрицательный
  • Максимум 2 цифры (десятки или сотни)
  • Сотни цифр не могут 0 (только 1-9)
  • Масштаб не более 1
  • Десятичное значение может быть 0 или 5 или вообще не равно

Таким образом, эти числа будут действительны, например:

  • 1.5
  • -1,5
  • 17.5
  • 15
  • -3
  • 30,5

Эти числа недействительны, например:

  • 1,57
  • 3041,5
  • 17.59
  • 915
  • -1,56
  • 05,0

Ответ 1

Как я уже сказал в комментариях, ваша первая ненулевая цифра будет подсчитываться, тогда вы добавите еще две, которые теперь позволят трехзначные числа, такие как 915. Чтобы решить эту проблему, regexp (с вашими тестовыми окнами):

^[+-]?(?:(?!0)\d{1,2}|0)(?:\.[05])?$

Я использую отрицательный lookahead (?!0), чтобы убедиться, что первая цифра не равна нулю, а затем просто требует требуемое количество цифр. Он также позволяет 0.5 и аналогично с помощью дизъюнкции |0. Если вы предпочитаете .5, это будет следующим:

^[+-]?(?!0)\d{,2}(?:\.[05])?$

Если вы хотите запретить 3.0 (разрешено вашими правилами) и разрешить только 3 (как вы подразумеваете в примерах), замените последнюю часть:

^[+-]?(?:(?!0)\d{1,2}|0)(?:\.5)?$

Однако это гораздо менее читаемо, чем @Arkku nice Float(number); используйте регулярные выражения, если они вам действительно нужны.

Ответ 2

Как насчет Float(number) (исключение catch для обнаружения ошибок синтаксического анализа), а затем проверить число с плавающей запятой? Это будет легче для нескольких свойств, чем для написания регулярного выражения. Если вам нужно заставить подмножество синтаксиса, принятого Ruby для использования (почему?), Проверьте только ту часть с регулярным выражением.

Ответ 3

Вот целая веб-страница по проверке поплавков в регулярных выражениях: http://www.regular-expressions.info/floatingpoint.html

Тем не менее,

  • {1,1} эквивалентен {1}, который эквивалентен не помещению его вообще, поэтому вы можете удалить его
  • Если вы хотите убедиться, что 0.5xyz не проходит, добавьте $ в конец

С приведенными выше изменениями это будет выглядеть так: /^[-+]?[1-9]\d{0,2}(\.\d)?$/

Ответ 4

В соответствии с вашими действительными и недопустимыми примерами: Regex для плавающей запятой?

Это регулярное выражение будет работать:

 ^[+-]?([1-9][0-9]?|0)(\.[05])?$

Ответ 5

/^[-+]?\d{0,2}(\.[05])?(?!\d)$/

Соответствует, когда:

  • Значение является либо положительным, либо отрицательным

  • величина меньше 100. В диапазоне (-99.5 to 99.5)

  • Десятичное значение .0 или .5 или отсутствует (другими словами, .0 или .5 или отсутствует)

Таким образом, эти числа будут действительны, например:

1.5 -1.5 17.5 15 -3 30.5 -10.0 99.5

Эти числа недействительны, например:

1.57 3041.5 17.59 915 -1.56 05.0 99.6