2012-06-06 3 views
7

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

.5 
0.5 
1.5 
1234 

, но не

0.5.5 
absnd (any letter character or space) 

У меня есть это, что удовлетворяет всем, но 0.5.5

^[.?\d]+$ 
+0

Лучший ответ, а исследовательская статья здесь: https://stackoverflow.com/a/39399503/715269 – Gangnus

ответ

18

Это довольно распространенная задача. Самый простой способ я знаю, чтобы справиться с ней заключается в следующем:

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

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

^[+-]?(\d*|\d{1,3}(,\d{3})*)(\.\d+)?\b$ 

Это \b есть слово перерыв, но я использую его как подлый способ требует по меньшей мере, одну цифры в конец строки. Таким образом, пустая строка или один + не совпадают.

Однако будьте уверены, что регулярные выражения не являются идеальным способом для синтаксического анализа числовых строк. Все современные языки программирования, о которых я знаю, имеют быстрые, простые, встроенные методы для этого.

+1

+1 для «встроенного метода», абзац – niko

+0

Будете ли вы использовать downvoter? –

+0

Кажется, у нас есть тролль вокруг этих частей. Я тоже был замешан. –

1

Это может сработать:

^(?:\d*\.)?\d+$ 
+1

Это требует десятичную точку. –

+0

Он делает, я сопоставляю \ d * в скобках, а не \ d + – niko

+0

Теперь выглядит хорошо. Я прокомментировал, прежде чем вы добавили '?'. –

3

должны работать:

^(?!.*\..*\.)[.\d]+$ 

Это использует отрицательный предпросмотр, чтобы убедиться, что есть менее два . символов в строке.

http://www.rubular.com/r/N3jl1ifJDX

+0

Это проходит через строку дважды. –

+0

Почему вы хотите сделать это сложным? –

+3

Тайлер и Джастин - я согласен с тем, что ваш метод лучше, но оставит это в качестве альтернативы. Метод lookahead хорош для проверки нескольких условий, подобных этому (например, при проверке пароля), но это делает сложнее, чем это, нравится +1! –

10

Никто не кажется, что составляет для отрицательных чисел. Кроме того, некоторые из них создают группу захвата, которая не нужна. Это самое тщательное решение IMO.

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

EDIT: Почему нижний предел?

+0

Выглядит хорошо, у меня есть верхняя часть. –

+2

* тянется для рукопожатие * –

2

Вот намного более простое решение, которое не использует просмотровых aheads или посмотрите-зады:

^\d*\.?\d+$ 

Чтобы ясно понять, почему это работает, читать справа налево:

  • В конце требуется как минимум одна цифра.
    7 работы
    77 работы
    .77 работы
    0.77 работы
    0. не работает
    пустая строка не работает
  • Один период, предшествующий цифра не является обязательным ,
    .77 работы
    77 работы
    ..77 не работает
  • любое число цифр, предшествующих (необязательно) период. .77 работы
    0.77 работы
    0077.77 работы
    0077 работы

Не используя просмотровых aheads и просмотровых задом имеет дополнительное преимущество, не беспокоясь о RegEx атак DOS.

НТН

Смежные вопросы