Есть несколько альтернатив. Во-первых, использование упреждающего утверждения нулевой ширины позволяет упростить остальную часть регулярного выражения:
/^[-+]?(?=\.?\d)\d*(?:\.\d*)?$/
Если вы хотите избежать заблаговременного просмотра, я бы попытался отговорить регулярное выражение от обратного отслеживания:
/^[-+]?(?:\.\d+|\d+(?:\.\d*)?)$/
/^[-+]?(\.\d+|\d+(\.\d*)?)$/ # if you don't mind capturing parens
Обратите внимание, что вы сказали "основание 10", так что вы, возможно, захотите запретить дополнительные начальные нули, поскольку "014" может быть восьмеричным:
/^[-+]?(?:\.\d+|(?:0|[1-9]\d*)(?:\.\d*)?)$/
/^[-+]?(\.\d+|(0|[1-9]\d*)(\.\d*)?)$/
Наконец, вы можете заменить \d
на [0-9]
, так как некоторые регулярные выражения не поддерживают \d
или потому что некоторые регулярные выражения позволяют \d
соответствовать "цифрам" Юникода, отличным от 0..9, таким как " АРАБСКО-ИНДИЧЕСКИЙ ЦИФР "s.
/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/
/^[-+]?(\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?)$/