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


113

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

123
123.
123.4

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

123..

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

Любой был бы очень признателен!


Лучший ответ здесь: stackoverflow.com/a/39399503/715269
Гангнус

Ответы:


191

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

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

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


2
@OrangeDog, ваш оригинал больше, чем можно было бы ожидать. например 'cow3.45tornado';)
С. Альбано,

39
Он также соответствует одной точке, которая не является допустимым десятичным числом. Лучшим регулярным выражением было /^\d*\.?\d+$/бы принудительное введение цифры после десятичной точки.
Чандраншу

2
@Chandranshu, и он соответствует пустой строке, которую также решит ваше изменение.
OGHaza

2
@Chandranshu "не требует цифры после десятичной дроби"
OrangeDog

3
Это решение не работает. Он требует десятичных знаков, в то время как OP четко говорит: необязательные десятичные знаки.
Alex G

113
/\d+\.?\d*/

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

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

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

Визуализация регулярных выражений

Демо Debuggex


12
Да, но ответ, получивший наибольшее количество голосов, неверен, он соответствует как .пустой строке, так и.
OrangeDog

1
@Gangnus Также здесь не сказано, что ".digit" должен быть сопоставлен. Если они этого хотели, то должны были сказать.
OrangeDog

2
@EqualityInTech Я почти уверен, что это не так - в нем вообще нет группировки.
OrangeDog

1
Хм ... Думаю, я не совсем понимаю злые регулярные выражения, как я думал. Сожалею.
JDB все еще помнит Монику

1
@AlexanderRyanBaggett это точно соответствует указанному вопросу. Как видите, он вообще не включает -.
OrangeDog

74

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

/^[+-]?((\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

И отвергнем эти не числа:

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

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


1
Лучше всего, потому что соответствует числу, за которым следует точка (42.). Однако есть ошибка / ложное срабатывание, поскольку оно соответствует этому: 3 .... 3, что можно исправить, добавив еще две круглые скобки для принудительного применения начального и конечного символов ^ $: / ^ ([+ -]? (\ D + (\ . \ d *)?) | (\. \ d +)) $ /
Пит Элвин

1
Спасибо, Пит, хорошо замеченный. Теперь ответ был исправлен, добавлены дополнительные скобки, чтобы он работал так, как задумано. Сейчас написано вроде ^A?(B|C)$. Раньше было написано, ^A?B|C$что на самом деле значит (^A?B)|(C$)что было неверно. Примечание: ^(A?B|C)$также неверно, потому что фактически означает, ^((A?B)|(C))$что не соответствует "+.5".
Hoylen 07

2
Это лучший ответ. Другие ответы не относятся ко всем случаям. Я сам делаю то же самое, за исключением того, что использую опережающий просмотр для обработки случаев пропущенных цифр: /^[+-pting?(?=\d|\.\d)\d*(\.\d*)?$ /
PhilHarvey

1
Это единственное правильное регулярное выражение здесь. Но некоторые люди не согласятся с «34». Я хотел бы предложить + после второй г вместо *
Гангнус

1
Это также соответствует 0000.2, что, вероятно, не то, что нужно.
Аарон Зорел 08

12

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

\d+\.?\d*

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


1
Нет, это не соответствует123.
Барт Кирс

1
Спасибо за замечание. Изменено мое регулярное выражение.
Kash

4
Действительно, но теперь вы просто отредактировали его в том, что уже опубликовано кем-то другим. Попробуйте просто удалить еще один «правильный» ответ.
Барт Кирс,

@BartKiers Я поддержал это, потому что ответ, о котором вы говорите, имеет дополнительную косую черту в начале, поэтому у меня это не сработало. Это сработало.
Эдисон

@Edison, что косая черта является разделителем регулярных выражений: не является частью самого шаблона. Вы увидите множество ответов, содержащих эти разделители.
Барт Кирс

10

Я считаю, что это лучший вариант, потому что он соответствует всем требованиям:

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

1
Для меня это лучший ответ, так как строка: «4». (например) не является допустимым числом, по крайней мере, на рубиновом языке. Тем не менее, самые популярные ответы принимают «4». как регулярное выражение числа, что неверно.
Виктор

3

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

^\d*\.?\d+$

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

.
3.

В зависимости от того, какой язык вы используете, вам могут понадобиться слэши. Например: /^\d*\.?\d+$/
Charles Naccio

это позволит.3
Рой Намир 02

3

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

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

матчей:
11
11.1
0.2

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


Спасибо, очень просто и соответствует тому, что мне нужно
Hany


2

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

^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

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

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

Цифры перед десятичной точкой могут быть как одной цифрой, в этом случае это может быть от 0 до 9, так и более чем одной цифрой, и в этом случае она не может начинаться с 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

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


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

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

Это использует суффикс и префикс, функции RegEx.

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


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

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


1

На ваш вопрос уже дан ответ, так что это просто дополнительная информация для тех, кто хочет только 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: нет совпадения


Соответствует ли это отрицательным числам?
Александр Райан Баггетт

1
@AlexanderRyanBaggett, вам нужно проверить наличие отрицательного знака, это будет: ^ -? \ D + (\. \ D {2})? $
PersyJack

0

В 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]+))|))

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.