2017-02-06 15 views
-2

Я пытаюсь регулярное выражение, которое удовлетворяет следующим для всего 10-значного числа. Пробовал это до сих пор:Что такое регулярное выражение для всего 10-значного числа с десятичной точностью 1 или 2?

^(\d){0,8}(\.){0,1}(\d){0,2}$ 

Он отлично работает, но терпит неудачу, если я даю следующее:

123456789.0 

Действительный пример:

1234567890 (total 10 digits) 
1234567.1 (total 8 digits) 
12345678.10 (total 10 digits) 
123456789.1 (total 10 digits) 

Invalid пример: 12345678901 (11 символов)

+2

Вопросы, начинающиеся с 'Я want', не проявляя никаких усилий, как правило, не очень хорошо получил – baao

+0

Почему' 1234567.1 (всего 8 цифр) 'действительный пример? – Toto

+1

Какой язык программирования вы используете? – baao

ответ

0

Решение с использованием String.prototype.match() и RegExp.prototype.text() функции:

var isValid = function (num) { 
 
    return /^\d+(\.\d+)?$/.test(num) && String(num).match(/\d/g).length <= 10; 
 
}; 
 

 
console.log(isValid(1234567890)); 
 
console.log(isValid(12345678.10)); 
 
console.log(isValid(12345678901)); 
 
console.log(isValid('123d3457'));

+1

Это не сработает против '123.123123'. –

0

Вот путь:

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

Объяснение:

^    : begining of string 
    (?:    : start non capture group 
    \d{1,10}  : 1 upto 10 digits 
    |    : OR 
    (?=   : start look ahead 
     \d+\.\d\d?$ : 1 or more digits then a dot then 1 or 2 digits 
    )    : end lookahead 
    [\d.]{3,11} : only digit or dot are allowed, with a length from 3 upto 11 
    )    : end group 
$     : end of string 

В действии:

#!/usr/bin/perl 
use Modern::Perl; 

my $re = qr~^(?:\d{1,10}|(?=\d+\.\d\d?$)[\d.]{3,11})$~; 
while(<DATA>) { 
    chomp; 
    say (/$re/ ? "OK: $_" : "KO: $_"); 
} 
__DATA__ 
1 
123 
1.2 
1234567890 
1234567.1 
12345678.10 
123456789.1 
12345678901 
1.2.3 

Выход:

OK: 1 
OK: 123 
OK: 1.2 
OK: 1234567890 
OK: 1234567.1 
OK: 12345678.10 
OK: 123456789.1 
KO: 12345678901 
KO: 1.2.3 
0

вы можете разбить ваш шаблон в 3 шага:

Первый шаг
Вам нужно по крайней мере 8 цифр + 1 или 2 точности, которые оба являются необязательными
\d{8}\.?\d?\d? Здесь . и обе цифры являются необязательными

Второй шаг
Вам нужно по крайней мере 9 цифр + 1 точность и это его
\d{9}\.?\d? Здесь . и цифры не являются обязательными

Затем вы можете смешать эти три правила вместе с или | ключевое слово

^(\d{8}\.?\d?\d?|\d{9}\.?\d?)$

Хорошо, теперь это регулярное выражение соответствует только 7 до 10 цифр с 1 или 2 точность
Это не соответствует менее 8 цифр и сложная часть здесь, что вы можете изменить второй шаг\d{8} с \d{1,8}, а затем он соответствует от 1 до 9999999999 и плюс точность 1 или 2.

, что вы хотите:
^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$

echo 1 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
1 
echo 9999999999 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
9999999999 
echo 1.1 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
1.1 
echo 1.12 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
1.12 
echo 1234567.1 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
1234567.1 
echo 1234567.12 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
1234567.12 
echo 99999999.9 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
99999999.9 
echo 99999999.99 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
99999999.99 

не совпадают

echo 1.111 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
echo 1234567.111 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
echo 123456781.11 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
echo 1234567891.1 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&' 
echo 123456789101 | perl -lne '/^(\d{1,8}\.?\d?\d?|\d{9}\.?\d?)$/ && print $&'