2015-09-29 3 views
2

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

0.2 
.1243 
1. 
-0.34 
+033.98274E-10 
-.1e+004 

Я создал следующее регулярное выражение, которое соответствует всем этим: [+-]?[0-9+\.]+([E][+-]?[0-9]+)?, однако это также соответствует одиночные десятичной точки, такие, как если бы у меня было что-то вроде param.attribute , он подберет эту десятичную точку. Как я могу обойти это? Я думал, что в части [0-9+\.]+ потребует, чтобы строка содержала хотя бы одно числовое значение.

+0

Если это работает так, как вы сказали, что не будет соответствовать '.1234', как вы сказали: это соответствует по меньшей мере, одно числовое значение перед точка. Он также не соответствует 'e' в вашем примере. – moffeltje

+0

Нет, это соответствует '.1234'. Моя проблема заключается в том, что выражение выше также соответствует только одному символу '.', означающему, что все и все' .' совпадают, в том числе не в числах. – zephyr

ответ

3

Вы можете использовать чередование, чтобы убедиться, что либо 1., либо .1 соответствует. Избегайте всех подмасками необязателен, если вы не хотите, чтобы в конечном итоге с одного периода совпадений:

[-+]?(?:[0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)(?:[eE][-+]?[0-9]+)? 
    ^--- Alernative 1 | Alternative 2-^ 

См regex demo

Больше "fun" facts about alternation in regular expressions:

Вы можете использовать чередование, чтобы соответствовать одной регулярной выражение из нескольких возможных регулярных выражений.
Если вы хотите найти точный текст cat или dog, разделите обе опции с помощью вертикальной полосы или символа трубы: cat|dog. Если вам нужно больше опций, просто раскройте список: cat|dog|mouse|fish.

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

А вот мои 5 центов: держать матч регулярного выражения как можно более чистым и если вам нужно получить доступ к любому из вариантов после того, как найдено совпадение, использовать не захват групп (т.е. (?: ...)) с чередования.

+0

Большое спасибо! Раньше я не знал об чередовании! – zephyr

+1

Я добавил больше о чередовании в регулярных выражениях. –

+1

upvote для групп без захвата – clapsus

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