十进制数的正则表达式

时间:2010-03-03 06:07:58

标签: regex decimal

任何人都可以为长度介于1到17之间的数字提供正则表达式,并且可以选择包含最多4个位置的尾数吗?长度17包括特征和尾数。

编辑:

17的长度不包括小数点。

有效示例:

12345678901234567 
1234567890123.4567 
123456789012345.67
12.34

无效:

12345678901234.5678 (Length of numerals = 18)

感谢。

6 个答案:

答案 0 :(得分:5)

^\d{17}$|^\d{13}(?=.{5}$)\d*\.\d*\d$

正则表达式解释说:

^\d{17}$    //A string of 17 digits 
|           //or
^\d{13}     //13 digits followed by
(?=.{5}$)   //5 characters, of which 
\d*\.\d*    //one is a decimal point and others are digits
\d$         //and the last one is a digit

答案 1 :(得分:3)

好的,这是我能做的最好的事情:

/^\d{1,17}$|(?=^.{1,18}$)^\d+\.\d{1,4}$/

基本上,匹配1-17位数字,或长度为1-18的字符串,由两组以句点分隔的数字组成。右边的集合只能包含1-4个数字。

答案 2 :(得分:2)

不要在正则表达式中完全执行此操作。在大多数编程语言中,问题变得几乎无足轻重,这样您就可以更轻松地编写,验证,测试和维护。当然,您仍然可以使用正则表达式作为解决方案的一部分,但您不必这样做。伪代码:

m = re.match(r"(?P<before>[0-9]+)(?P<after>\.[0-9]{1,4})?$", input_string)
if not m:
  return "no match"
before, after = m.group("before", "after")
after = after[1:] if after else ""  # remove period or set to empty string
if len(before) + len(after) > 17:
  return "incorrect length"
return "valid"

答案 3 :(得分:1)

它不是特别漂亮,但由于可能性很小(0,1,2,3,4长度的尾数),我可能只列出它们:

\d{17}|\d{16}\.\d{1}|\d{15}\.\d{2}|\d{14}\.\d{3}|\d{13}\.\d{4}

答案 4 :(得分:0)

用您最喜欢的语言,您可以进行一些逻辑检查,例如Python

num="1234567890133.3456"
if "." in num and len(num)==17 :
     n=num.split(".")
     if len(n[1])>4:
         print "cannot have more than 4 decimal places"
     elif len(n)==2 and n[0].isdigit() and n[1].isdigit():
         print "yes, decimal"
elif len(num)==17 and num.isdigit():
     print "%s is number with no decimal and is exactly 17 digits." % num
else:
     print "%s not ok, check length is 17" % num

答案 5 :(得分:0)

我从上面的伟大解决方案中创建了这个正则表达式。它可以帮助任何人。如果您发现任何错误,请告诉我。
        String decimalRegex =&#34;&#34; +                 &#34; ^(?0 \ d,])\ +&#34?; + // ^数字开头
                &#34;(\ d {0,&#34; + size +&#34;} |&#34; + //没有组符号的数字值|(OR)
                &#34;(\ d {0,&#34 + REM(大小,GROUPSIZE)+&#34;},)&#34; +
                &#34;(\ d {0,&#34; + groupSize +&#34;},){0,&#34; + div(size,groupSize)+&#34;} \ d {&#34 + GROUPSIZE +&#34;})&#34; + //组符号为数字的数字值                 &#34;((([A-ZA-Z] {0,2} | \&#34; | \&#39;?)\ S \ +)| \)&#34 + <无线电通信/>                 &#34;(\ d {0,&#34 + +规模&#34;})?&#34; + //没有组符号的十进制值
                &#34;(\ S([A-ZA-Z] {0,2} | \&#34; | \&#39;))$&#34 ;; //结束

private int rem(int size,int groupSize ){
    int rem = (size - groupSize)%groupSize;
    return rem;
}

private int div(int size,int groupSize ){
    int div = (size - groupSize)/groupSize;
    return div;
}