Примеры:
"1" yes
"-1" yes
"- 3" no
"1.2" yes
"1.2.3" no
"7e4" no (though in some cases you may want to allow scientific notation)
".123" yes
"123." yes
"." no
"-.5" yes
"007" yes
"00" yes
Примеры:
"1" yes
"-1" yes
"- 3" no
"1.2" yes
"1.2.3" no
"7e4" no (though in some cases you may want to allow scientific notation)
".123" yes
"123." yes
"." no
"-.5" yes
"007" yes
"00" yes
Это позволяет опционально "+" и "-" спереди. И позволяет использовать конечные или начальные пробелы.
/^\s*[+-]?(?:\d+\.?\d*|\d*\.\d+)\s*$/
Существует несколько альтернатив. Во-первых, использование утверждения с нулевой шириной позволяет упростить остальное регулярное выражение:
/^[-+]?(?=\.?\d)\d*(?:\.\d*)?$/
Если вы хотите избежать внешнего вида, я попытаюсь отменить регулярное выражение от отслеживания обратных ссылок:
/^[-+]?(?:\.\d+|\d+(?:\.\d*)?)$/
/^[-+]?(\.\d+|\d+(\.\d*)?)$/ # if you don't mind capturing parens
Обратите внимание на то, что вы сказали "base 10", чтобы на самом деле вы могли запретить дополнительные ведущие нули, поскольку "014" может быть восьмым:
/^[-+]?(?:\.\d+|(?:0|[1-9]\d*)(?:\.\d*)?)$/
/^[-+]?(\.\d+|(0|[1-9]\d*)(\.\d*)?)$/
Наконец, вы можете заменить \d на [0-9], поскольку некоторые регулярные выражения не поддерживают \d или потому, что некоторые регулярные выражения позволяют \d соответствовать Unicode "цифры", отличные от 0..9, такие как "t23", ARABIC-INDIC DIGIT ".
/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/
/^[-+]?(\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?)$/
Совпадает со всеми указанными примерами, не фиксирует никаких групп:
^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$
Не соответствовать "1." (И т.д.):
^[+-]?(?:\d+(?:\.\d+)?|\.\d+)$
Не беспокоит пробел (используйте функцию обрезки).
Регулярное выражение в perlfaq4: Как определить, является ли скаляр числом/целым/целочисленным/float? делает то, что вы хотите, и он также обрабатывает нотацию "e".
while( <DATA> )
{
chomp;
print /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/ ?
"$_ Works\n"
:
"$_ Fails\n"
;
}
__DATA__
1
-1
- 3
1.2
1.2.3
7e4
.123
123.
.
-.5
В зависимости от языка, который вы кодируете в этой функции, может уже существовать.