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

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

Он должен принимать такие числа, как

-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#.


person luvieere    schedule 02.12.2009    source источник
comment
Ах, я чувствую, что мое регулярное выражение короче вашего конкурса. То, из-за чего спорят гики... :)   -  person Chen Levy    schedule 02.12.2009
comment
0.0 будет с какой стороны? принять или отвергнуть?   -  person YOU    schedule 02.12.2009
comment
Вы забыли включить 0.000 в свои тестовые примеры, большинство ранних ответов принимают это, но в моей книге это все еще ноль. :)   -  person    schedule 02.12.2009
comment
Как насчет 001.000? принять правильно?   -  person YOU    schedule 02.12.2009
comment
Я готов принять 001.000 как принятое, если решение достаточно короткое.   -  person luvieere    schedule 02.12.2009
comment
Разрешение ведущих нулей вызовет путаницу, поскольку они почти повсеместно запрещены. Точно так же нули в конце почти всегда принимаются (и могут быть значительными).   -  person    schedule 02.12.2009


Ответы (4)


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

EDIT Обновлено с учетом новых требований (последние десятичные знаки могут быть равны нулю)

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

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


EDIT2 Если, например. 001.000 может пройти

^-?(?=.*[1-9])\d+(\.\d+)?$
person jensgram    schedule 02.12.2009
comment
К сожалению, я не знаком со спецификой регулярных выражений в С#. - person jensgram; 02.12.2009
comment
Тем не менее, к счастью, ваш синтаксис был правильным. В качестве дополнения я бы вместо этого выбрал ^-?(0\.\d*[1-9]\d*|[1-9]\d*(\.\d+)?)$, чтобы сохранить согласованность возможности ввода конечных нулей после чисел в диапазоне (-1, 1), а не только после чисел, начинающихся с положительной цифры. - person luvieere; 02.12.2009
comment
Почти: отбраковывает 0,10. Добавьте еще один \d* после первого [1-9]. - person ; 02.12.2009
comment
Да, я не совсем был уверен, например. 0.10 следует отклонить или нет. Теперь я вижу, что я был менее чем последователен :) - person jensgram; 02.12.2009
comment
@luvieere Я думаю, что мои навыки l33t regex0rz уже в значительной степени исчерпаны :) 26 символов, кажется, мой лучший шанс. - person jensgram; 02.12.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
)
person leepowers    schedule 02.12.2009

-?(?!0)\d+(\.\d+)?

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

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

person Wernight    schedule 02.12.2009
comment
Мне нужен самый короткий, так как он будет находиться где-то в файле XAML, и я хочу, чтобы он был как можно короче. - person luvieere; 02.12.2009
comment
Разница в 5-15 байт достаточно важна, чтобы игнорировать производительность и четкость? - person ; 02.12.2009
comment
Символы в регулярном выражении не имеют большого значения после его компиляции. Оценщик RegExp — это конечный автомат. Есть много способов улучшить граф FSM, и это то, что делают некоторые компиляторы. Короче говоря, нет прямой зависимости между длиной строки RegExp и скоростью ее вычисления. - person Wernight; 02.12.2009
comment
Меня волнует не скорость, а визуальная компактность. Я бы не хотел, чтобы в XAML было большое регулярное выражение, за ним трудно следить. - person luvieere; 02.12.2009
comment
Что такое знак !? Я тестировал это, и оно не работает, оно не работает с 5.02 и многими другими... - person luvieere; 02.12.2009
comment
(?!...) является отрицательным прогнозным утверждением. В этот момент выражение ... не должно совпадать, чтобы утверждение было успешным. regular-expressions.info/lookaround.html - person ; 02.12.2009
comment
luvieere: Код-гольф (как это сделать кратчайшим путем... вне зависимости от других соображений) не заключается в создании кода, которому легко следовать. Код должен быть кратким, но не обязательно максимально коротким. Это определенно звучит так, как будто вы не будете часто редактировать это регулярное выражение, так какая вам разница, 5 символов или 25? Взгляните на такой язык, как APL, который определенно создавал короткие (с точки зрения символов) программы. en.wikipedia.org/wiki/APL_(язык_программирования)#Примеры - person ; 02.12.2009
comment
Для меня это соответствует 5.02 (хотя и не тестировалось на С#), может быть ваша проблема в отсутствии поддержки (?!)? . должен был сбежать. (Такую ошибку легко сделать, когда вы беспокоитесь о размере кода, а не о других вещах...: P) - person ; 02.12.2009
comment
Такую ошибку легко совершить... расскажи мне об этом! И также легко исправить, просто нажмите «Изменить» и приступайте к делу. - person luvieere; 02.12.2009
comment
Кстати, \. появился только как . из-за форматирования (сейчас исправлено). Это не примет -1. 5 или вы что-то другое имели в виду? - person ; 02.12.2009

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

person tchrist    schedule 23.11.2010