Регулярное выражение, чтобы соответствовать любому числу (реальное, рациональное вместе со знаками) - PullRequest
6 голосов
/ 18 февраля 2012

Я написал регулярное выражение для совпадения с любым числом:

  • Положительное и отрицательное
  • Десятичное число
  • Действительные числа

Следующее регулярное выражение работает хорошо, но есть один недостаток

([\+\-]{1}){0,1}?[\d]*(\.{1})?[\\d]*

Это положительно для входных данных, таких как + или - .Любые указатели будут с благодарностью.Спасибо.

Регулярное выражение должно работать со следующими входами

5, +5, -5, 0,5, +0,5, -0,5, .5, +.5, -.5

и не должен совпадать со следующими вводами

+

-

+.

-.

.

Вот ответ от tchrist, отлично работает.

(?:(?i)(?:[+-]?)(?:(?=[.]?[0-9])(?:[0-9]*)(?:(?:[.])(?:[0-9]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[0-9]+))|))

Ответы [ 3 ]

5 голосов
/ 18 февраля 2012

Если вам нужно что-то, похожее на C-float, вот как заставить Perl выкашливать регулярное выражение, которое делает это, используя модуль Regexp :: Common из CPAN :

$ perl -MRegexp::Common -le 'print $RE{num}{real}'
(?:(?i)(?:[+-]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[0123456789]+))|))

Вы можете настроить это немного, если хотите, но это дает вам основную идею.

Это действительно удивительно гибко. Например, это выдает шаблон для вещественных чисел с базой 2, которые допускают запятые каждые три места:

$ perl -MRegexp::Common -le 'print $RE{num}{real}{-base => 2}{-sep => ","}{-group => 3}'
(?:(?i)(?:[+-]?)(?:(?=[.]?[01])(?:[01]{1,3}(?:(?:[,])[01]{3})*)(?:(?:[.])(?:[01]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[01]+))|))

Документация показывает, что полный возможный синтаксис числовых шаблонов, которые он может вам выпустить, таков:

$RE{num}{int}{-base}{-sep}{-group}{-places} 
$RE{num}{real}{-base}{-radix}{-places}{-sep}{-group}{-expon} 
$RE{num}{dec}{-radix}{-places}{-sep}{-group}{-expon} 
$RE{num}{oct}{-radix}{-places}{-sep}{-group}{-expon} 
$RE{num}{bin}{-radix}{-places}{-sep}{-group}{-expon} 
$RE{num}{hex}{-radix}{-places}{-sep}{-group}{-expon} 
$RE{num}{decimal}{-base}{-radix}{-places}{-sep}{-group} 
$RE{num}{square} 
$RE{num}{roman}

Делая это по-настоящему, чтобы настроить его для того, что вы хотите. И да, конечно, вы можете использовать эти шаблоны в Java.

Наслаждайтесь.

3 голосов
/ 18 февраля 2012

Вам необходимо указать хотя бы одну цифру, т.е. использовать + вместо * для \d.

. Я думаю, вы также можете сбросить {1} в нескольких местах, так как этоподразумевается по умолчанию

Точно так же {0,1} можно отбросить, если за ним следует ?

Давая нам:

regex = "[+-]?(\\d+|\\d*\\.?\\d+)";
1 голос
/ 18 февраля 2012

Я думаю, что это должно сделать это:

[+-]?\d*(\.\d+)?

EDIT:

Я улучшил его, чтобы он не совпадал с точкой на -123., но для 123.456

EDIT2:

Так что он не совпадает только с + или -, вы можете проверить, что такой знак должен предшествовать либо точке, либо числу, причем точка является необязательной.

[+-]?(?=[\.?\d])\d*(\.\d+)?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...