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

Примеры:

"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

Это позволяет опционально "+" и "-" спереди. И позволяет использовать конечные или начальные пробелы.

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

Ответ 2

Существует несколько альтернатив. Во-первых, использование утверждения с нулевой шириной позволяет упростить остальное регулярное выражение:

/^[-+]?(?=\.?\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]*)?)$/

Ответ 3

Совпадает со всеми указанными примерами, не фиксирует никаких групп:

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


Не соответствовать "1." (И т.д.):

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


Не беспокоит пробел (используйте функцию обрезки).

Ответ 5

В зависимости от языка, который вы кодируете в этой функции, может уже существовать.