Ответы:
Используйте следующее:
/^\d*\.?\d*$/
^
- Начало строки;\d*
- 0 и более цифр;\.?
- Необязательная точка (экранированная, потому что в регулярном выражении .
это специальный символ);\d*
- 0 и более цифр (десятичная часть);$
- Конец строки.Это позволяет использовать десятичную дробь .5 вместо того, чтобы требовать начальный ноль, например 0,5.
/^\d*\.?\d+$/
бы принудительное введение цифры после десятичной точки.
/\d+\.?\d*/
Одна или несколько цифр ( \d+
), необязательная точка ( \.?
), ноль или несколько цифр ( \d*
).
В зависимости от вашего использования или механизма регулярных выражений вам может потребоваться добавить якоря начальной / конечной строки:
/^\d+\.?\d*$/
.
пустой строке, так и.
-
.
Для правильного выполнения вам потребуется регулярное выражение, подобное приведенному ниже:
/^[+-]?((\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)
Например, он будет соответствовать:
И отвергнем эти не числа:
Более простые решения могут ошибочно отклонять действительные числа или сопоставлять эти не числа.
^A?(B|C)$
. Раньше было написано, ^A?B|C$
что на самом деле значит (^A?B)|(C$)
что было неверно. Примечание: ^(A?B|C)$
также неверно, потому что фактически означает, ^((A?B)|(C))$
что не соответствует "+.5".
Попробуйте это регулярное выражение:
\d+\.?\d*
\ d + цифры перед необязательной десятичной дробью
.? необязательный десятичный знак (необязательный из-за квантификатора?)
\ d * необязательные цифры после десятичного числа
123.
Я считаю, что это лучший вариант, потому что он соответствует всем требованиям:
^\d+(\\.\d+)?$
В итоге я использовал следующее:
^\d*\.?\d+$
Это делает недействительным следующее:
.
3.
.3
вы можете использовать это:
^\d+(\.\d)?\d*$
матчей:
11
11.1
0.2
не совпадает:
.2
2.
2.6.9
Вот что я сделал. Это строже, чем любой из вышеперечисленных (и более правильный):
^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
^[+-]?(([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
и их эквиваленты со знаком, а также пустая строка.
^\d+(()|(\.\d+)?)$
Придумал это. Позволяет использовать как целые, так и десятичные числа, но принудительно использовать полное десятичное число (начальные и конечные числа), если вы решили ввести десятичное число.
На ваш вопрос уже дан ответ, так что это просто дополнительная информация для тех, кто хочет только 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: нет совпадения
В 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]+))|))
попробуй это. ^[0-9]\d{0,9}(\.\d{1,3})?%?$
у меня он протестирован и работал.