Вот почему вы получали ложные срабатывания с вашим исходным регулярным выражением:
/[0-9 -()+]+$/
^^^
Подчеркнутая мною часть образует диапазон от пробела (U+0020
) до левой скобки (U+0028
),делая ваше регулярное выражение эквивалентным этому:
/[0-9 !"#$%&'()+]+$/
Если вы хотите сопоставить дефис, вам нужно либо экранировать его обратной косой чертой, либо поместить его в начало или конец набора, например:
/[0-9 ()+-]+$/
Кроме того, если под "библиотекой регулярных выражений" вы подразумеваете RegExLib.com, я бы не стал доверять никаким регулярным выражениям, которые я там нашел.Тот, который вы опубликовали, является показательным примером:
/(^\d*\.?\d*[0-9]+\d*$)|(^[0-9]+\d*\.\d*$)/
Во-первых, его можно было бы написать гораздо более кратко:
/^(\d*\.?\d+|\d+\.\d*)$/
Во-вторых, он соответствует строкам, таким как 123.
и 000000.0000000
, который вы, вероятно, не хотите.Если вы действительно хотите сопоставлять только положительные числа, вы должны убедиться, что в строке есть хотя бы одна ненулевая цифра, до или после десятичной точки.Вот один из способов сделать это:
/^(?:[1-9]\d*(?:\.\d\d?)?|0\.[1-9]\d?|0\.0[1-9])$/