Правильное выражение десятичного числа, где цифра после десятичного числа является необязательной

Мне нужно регулярное выражение, которое проверяет число, но не требует цифры после десятичной дроби. то есть.

123
123.
123.4

все будут действительны

123..

будет недействительным

Любые были бы очень благодарны!

Ответ 1

Используйте следующее:

/^\d*\.?\d*$/
  • ^ - начало строки;
  • \d* - 0 или более цифр;
  • \.? - необязательная точка (экранированная, потому что в регулярном выражении . является специальным символом);
  • \d* - 0 или более цифр (десятичная часть);
  • $ - Конец строки.

Это позволяет использовать .5 десятичное значение, а не требовать начального нуля, например 0,5

Ответ 2

/\d+\.?\d*/

Одна или несколько цифр (\d+), необязательный период (\.?), Ноль или несколько цифр (\d*).

В зависимости от вашего использования или движка регулярных выражений вам может понадобиться добавить начальные/конечные якоря строки:

/^\d+\.?\d*$/

Regular expression visualization

Debuggex Demo

Ответ 3

Для правильной работы вам нужно регулярное выражение, подобное следующему:

/^[+-]?((\d+(\.\d*)?)|(\.\d+))$/

Такое же выражение с пробелом, используя расширенный модификатор (поддерживаемый Perl):

/^  [+-]? ( (\d+ (\.\d*)?)  |  (\.\d+) ) $/x

или с комментариями:

/^           # Beginning of string
 [+-]?       # Optional plus or minus character
 (           # Followed by either:
   (           #   Start of first option
     \d+       #   One or more digits
     (\.\d*)?  #   Optionally followed by: one decimal point and zero or more digits
   )           #   End of first option
   |           # or
   (\.\d+)     #   One decimal point followed by one or more digits
 )           # End of grouping of the OR options
 $           # End of string (i.e. no extra characters remaining)
 /x          # Extended modifier (allows whitespace & comments in regular expression)

Например, он будет соответствовать:

  • 123
  • 23,45
  • 34.
  • +0,45
  • -123
  • -273,15
  • -42.
  • -. 45
  • +516
  • +9,8
  • + 2.
  • +. 5

И отклонит эти не номера:

  • . (одна десятичная точка)
  • -. (отрицательная десятичная точка)
  • +. (плюс десятичная точка)
  • (пустая строка)

Более простые решения могут неправильно отклонять допустимые числа или соответствовать этим не номерам.

Ответ 4

Попробуйте это регулярное выражение:

\d+\.?\d*

\ d + цифры перед необязательным десятичным знаком.? необязательный десятичный (необязательный из-за квантора?)
\ d * необязательные цифры после десятичной дроби

Ответ 5

В итоге я использовал следующее:

^\d*\.?\d+$

Это делает следующее недопустимым:

.
3.

Ответ 6

Какой язык? В стиле Perl: ^\d+(\.\d*)?$

Ответ 7

Я думаю, что это лучший (соответствует всем требованиям): ^\D + (\.\D +)? $

Ответ 8

Это то, что я сделал. Он более строгий, чем любой из вышеперечисленных (и более правильный, чем некоторые):

^0$|^[1-9]\d*$|^\.\d+$|^0\.\d*$|^[1-9]\d*\.\d*$

Строки, которые проходят:

0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34

Неверные строки:

.
00000
01
.0.
..
00.123
02.134

Ответ 9

(?<![^d])\d+(?:\.\d+)?(?![^d])

чистый и простой.

Здесь используются функции Суффикса и Префикса, RegEx.

Он возвращает true - false для условия IsMatch

Ответ 10

^\d+(()|(\.\d+)?)$

Придумал это. Позволяет как целое, так и десятичное, но заставляет полный десятичный (начальный и конечный числа), если вы решите ввести десятичное число.

Ответ 11

Вы можете использовать это:

^\d+(\.\d)?\d*$

Матчи:
11
11,1
0.2

не совпадает:
0,2
2.
2.6.9

Ответ 12

В Perl используйте команду Regexp:: Common, которая позволит вам собрать точно настроенное регулярное выражение для вашего конкретного формата чисел. Если вы не используете Perl, сгенерированное регулярное выражение все еще может использоваться другими языками.

Печать результата генерации примерных регулярных выражений в Regexp:: Common:: Number:

$ perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))

Ответ 13

На то, что вы спросили, уже дан ответ, так что это просто дополнительная информация для тех, кто хочет ввести только 2 десятичных знака:

^\d+(\.\d{2})?$

^: начало строки
\d: цифра (равна [0-9])
+: один и неограниченное количество раз

Группа захвата (.\D {2})?
? : ноль и один раз. : персонаж.
\d: цифра (равна [0-9])
{2}: ровно 2 раза
$: конец строки

1: матч
123: матч
123.00: матч
123.: нет совпадений
123..: нет совпадений
123.0: нет совпадений
123.000: нет совпадений
123.00.00: нет совпадений

Ответ 14

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

должно отражать то, что люди обычно считают правильно сформированным десятичным числом.

Цифры перед десятичной точкой могут быть либо одной цифрой, в этом случае она может быть от 0 до 9, либо более чем одной цифрой, и в этом случае она не может начинаться с 0.

Если перед десятичным знаком присутствуют какие-либо цифры, то десятичная дробь и следующие за ней цифры необязательны. В противном случае должен присутствовать десятичный знак, за которым следует хотя бы одна цифра. Обратите внимание, что после десятичной точки допускается множественный трейлинг 0.

grep -E '^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$'

правильно соответствует следующему:

9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001

а также их подписанные эквиваленты, тогда как он отклоняет следующее:

.
00
01
00.0
01.3

и их подписанные эквиваленты, а также пустая строка.