2013-02-20 3 views
1

Как я могу создать цифровую Regex с десятичным разделителем, но и ограничить длинуRegEx Числовой с Длиной

Я создаю это:

^[0-9]([0-9]*[.]?[0-9]){1,10}$ 

Тогда 1234567890,1234567890 действует, но с использованием 20 (+ 1 -> десятичный разделитель).

Как я могу сделать, чтобы ограничить до 10 символов?

Действительно:

1234567890 
123456789.0 
12345678.90 
1234567.890 
123456.7890 
12345.67890 
12345.67890 
1234.567890 
123.4567890 
12.34567890 
1.234567890 

Не действует:

12345678901 
12345678901. 
123456789.01 
12345678.901 
1234567.8901 
123456.78901 
12345.678901 
12345.678901 
1234.5678901 
123.45678901 
12.345678901 
1.2345678901 
.12345678901 

Заранее спасибо

+1

честно говоря, я бы просто проверьте, что он соответствует '/^\ d + (?: \. \ d *) $ /', а затем 's /\.//;' и проверяет длину. –

+0

Должно ли '.123' или' 123.' быть действительным совпадением? Кроме того, я предполагаю, что экспоненциальная нотация не разрешена? –

+0

@ LoneShepherd лучший вариант - это то, что вы говорите, но динамическая форма, мне тоже нужно контролировать длину. – Equiman

ответ

4
^(?:\d{1,10}|(?!.{12})\d+\.\d+)$ 

Объяснение:

^   # Start of string 
(?:  # Either match... 
\d{1,10} # an integer (up to 10 digits) 
|   # or 
(?!.{12}) # (as long as the length is not 12 characters or more) 
\d+\.\d+ # a floating point number 
)   # End of alternation 
$   # End of string 

Обратите внимание, что (как в вашем примере) .123 или 123. недействительны.

+0

+1 для использования причудливого утверждения lookahead для получения одного регулярного выражения :-) – Cameron

+0

@TimPietzker работает как шарм ... Спасибо !!! Я немного поменю '^ (?: [0-9] {1,10} | (?!. {12}) [0-9] + [.] [0-9] +) $' потому что имеют проблему с \ character в C# – Equiman

+0

Finaly .Net отлично работает с этим методом. Благодаря! – Equiman

1

Это более понятно и возможно даже быстрее, если вы не используете регулярное выражение для подсчета длины. Протестируйте его против ^\d+(?:\.\d+)$, удалите точки и возьмите длину.

Если вам действительно нужно, чтобы быть один регулярное выражение, вы можете использовать lookahead проверить формат и длина отдельно:

^\d{1,10}$|^(?=.{11}$)\d+\.\d+$ 

Объяснение:

^   # At the start of the string 
(?:  # either 
\d{1,10} # up to 10 digits 
|   # or 
(?=  # from here 
    .{11} # 11 characters 
    $  # to the end 
)   # and as well 
\d+\.\d+ # two dot-separated digit sequences 
)   # 
$   # 
+0

спасибо! Для этого решения нужны все 10 цифр. Я изменяю его на: '^ \ d {1,10} $ |^(? =. {1,11} $) \ d + \. \ D + $', чтобы допускать изменение от 1 до 10 цифр. – Equiman

+1

Возможно, я не уточню это в своих примерах. – Equiman

+0

Да, мне было непонятно. Я адаптировал ответ. – Bergi

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