六位数字的正则表达式,可选两位小数。

11

我需要一个正则表达式,用于匹配六位数字及可选的两位小数。 允许的值:

    .1  .11  0.11  10. 10.1   10.12  00.00  0.0  00.00

   123456 12345 1234 123 12 1 0 0. 123. 123.55 123456.  

最多是六个数字吗?允许使用 123456.78 吗? - MikeM
4个回答

13

正则表达式应该是:^\d{0,6}(\.\d{0,2})?$(它通过了您的所有示例)

更新:

为了避免空字符串和单个点,正则表达式为^(?!\.?$)\d{0,6}(\.\d{0,2})?$。该表达式添加了一个负向先行断言?!\.?$,排除了0或1个点。

我在Fiddle上添加了一个单元测试。


2
匹配空字符串和 .。它也会匹配 123456.78 - 是否应该? - MikeM
我更新了我的答案,排除了空字符串和单个点。但是123456.78似乎适用于“可选的6位数字...”意味着在小数点之前最多有6位数字。 - Hui Zheng
+1 for 单元测试。干得好。 - Patrick McElhaney

5

让我们将其分解为四个正则表达式。这四个中至少有一个必须匹配。

# decimal, 1-2 digits
\.\d{1,2}

# 1-4 digits, optional decimal, 0-2 digits
\d{1,4}\.?\d{0,2}

# 5 digits, optional decimal, optional digit
\d{5}\.?\d?

# 6 digits, optional decimal
\d{6}\.?

然后可以使用交替运算符 (|)将其组合成单个正则表达式:

(\.\d{1,2}|\d{1,4}\.?\d{0,2}|\d{5}\.?\d?|\d{6}\.?)

然后在正则表达式中添加插入符号 (^) 和美元符号 ($) 来匹配字符串的开头和结尾。(了解更多关于锚点的信息)

^(\.\d{1,2}|\d{1,4}\.?\d{0,2}|\d{5}\.?\d?|\d{6}\.?)$

这个方法不太适合大规模应用(例如,如果您想匹配100个数字,并且小数点后面有多达20位),但它是可行的并且相对容易理解。如果不必使用正则表达式,还有更简单的方法来解决这个问题。 :)

这允许空字符串和单个点。 - Hui Zheng
@ Hui 谢谢,问题已修复。现在每种情况都需要至少一个数字。 - Patrick McElhaney
1
现在你的解决方案已经通过了我的单元测试 :) - Hui Zheng

2

这个正则表达式符合您所有的示例,不接受超过6位数字或2位小数。

^\d{0,5}(\d\.\d?|\.\d)?\d?$

这允许使用“.”,但我不仅需要点,我需要值。 - Swapnil
更改以反映您的观点 - Teudimundo
2
匹配空字符串和123456.78 - 应该吗? - MikeM

0

Java快速示例,用于验证最大长度为10的字符串,即最多3位小数的9个数字。注意:为什么是9个数字而不是10个数字?因为小数点也算作一个字符。

package com.baji.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

import static org.junit.Assert.assertTrue;

/*
 * @author: Baji Shaik
 * Quick java example for validating string with max length as 10
 * i.e. 9 digits with max 3 decimal
 * NOTE: why 9 digits instead of 10 digits? because the decimal point also count as a character
*/
public class CheckNumber {


  @Test
  public void testSimpleTrue() {
    String s= "12345678.1";
    assertTrue(Validate10DigitsWithMax3DecimalsNumber(s));
    s= "1234567.12";
    assertTrue(Validate10DigitsWithMax3DecimalsNumber(s));
    s = "123456.123";
    assertTrue(Validate10DigitsWithMax3DecimalsNumber(s));
    s = "123456789";
    assertTrue(Validate10DigitsWithMax3DecimalsNumber(s));

    s = "1234567891";
    assertTrue(Validate10DigitsWithMax3DecimalsNumber(s));
    s = ".123";
    assertTrue(Validate10DigitsWithMax3DecimalsNumber(s));

    s = "000000.123";
    assertTrue(Validate10DigitsWithMax3DecimalsNumber(s));

  }


  public static boolean Validate10DigitsWithMax3DecimalsNumber(String value){
    Pattern pattern = Pattern.compile("^(\\.\\d{1,3}|\\d{1,6}\\.\\d{1,3}|\\d{1,7}\\.\\d{1,2}|\\d{1,8}\\.\\d{1}|\\d{1,10})$");
    Matcher matcher = pattern.matcher(value);
    if (matcher.find()){
      return true; 
    } 
    return false; 
  }

} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接