Какое самое короткое регулярное выражение, которое может сопоставлять ненулевые числа с плавающей запятой с любым количеством десятичных знаков? - PullRequest
8 голосов
/ 02 декабря 2009

Какое самое короткое регулярное выражение, которое может сопоставлять ненулевые числа с плавающей запятой с любым количеством десятичных знаков?

Должен принимать числа типа

-1
-5.9652
-7.00002
-0.8
-0.0500
-0.58000
0.01
0.000005
0.9900
5
7.5
7.005

но отклонить такие конструкции, как

.
.02
-.
-.996
0
-0
0.
-0.
-0.000
0.00
--
..
+
+0
+1
+.
+1.26
,etc

Мне не нужна поддержка научной нотации с e, E и т. Д.
Кстати, я использую язык C #.

Ответы [ 4 ]

7 голосов
/ 02 декабря 2009
^-?(0\.\d*[1-9]|[1-9]\d*(\.\d+)?)$

РЕДАКТИРОВАТЬ Обновлено, чтобы отразить новые требования (последние десятичные дроби могут быть ноль)

^-?(0\.\d*[1-9]\d*|[1-9]\d*(\.\d+)?)$

(короче, чем использование lookahead: ^-?(0\.(?=[1-9])\d*|[1-9]\d*(\.\d+)?)$.)


РЕДАКТИРОВАТЬ2 Если, например, 001.000 может пройти

^-?(?=.*[1-9])\d+(\.\d+)?$
0 голосов
/ 23 ноября 2010

Вы можете рассмотреть эти варианты .

0 голосов
/ 02 декабря 2009
-?(?!0)\d+(\.\d+)?

Примечание: не забудьте поставить ^ $, если это не сделано вашим сопоставителем регулярных выражений.

Могу я спросить, почему «самый короткий»? Прекомпилятор RegExp или то же самое с несоответствующими группами может быть быстрее. Также тест на ноль мог бы быть и быстрее.

0 голосов
/ 02 декабря 2009

Это я всегда использую:

(\+|-)?([0-9]+\.?[0-9]*|\.[0-9]+)([eE](\+|-)?[0-9]+)?

Используется в примере PHP:

<?php

$s= '1.234e4';

preg_match('~(\+|-)?([0-9]+\.?[0-9]*|\.[0-9]+)([eE](\+|-)?[0-9]+)?~', $s, $m);
print_r($m);

?>

Выход:

Array
(
    [0] => 1.234e4
    [1] =>
    [2] => 1.234
    [3] => e4
)
...