十位精度为1或2的总10位数的正则表达式是什么?

时间:2017-02-06 09:59:51

标签: regex

我正在尝试使用满足以下内容的正则表达式来获得总共10位数字。 到目前为止试过这个:

^(\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)

无效的示例: 12345678901(11个字符)

3 个答案:

答案 0 :(得分: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'));
&#13;
&#13;
&#13;

答案 1 :(得分: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

答案 2 :(得分:0)

你可以分三步打破你的模式:

第一步
您需要至少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 $&'