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

Примеры:

"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

Ответы [ 5 ]

4 голосов
/ 02 октября 2008

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

/^[-+]?(?=\.?\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]*)?)$/
4 голосов
/ 26 сентября 2008

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

/^\s*[+-]?(?:\d+\.?\d*|\d*\.\d+)\s*$/
2 голосов
/ 07 декабря 2008

Регулярное выражение в perlfaq4: Как мне определить, является ли скаляр числом / целым / целым / числом с плавающей точкой? делает то, что вы хотите, и обрабатывает нотацию "е" тоже.

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
2 голосов
/ 26 сентября 2008

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

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


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

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


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

0 голосов
/ 26 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...