2

我需要一个可以验证的正则表达式Decimal (18,3),这意味着精度为 18,比例为 3。

它需要通过以下标准:

  • 逗号前的最大位数是15
  • 逗号后的最大位数是3

有效示例

123456789.123
123456789123456.12
12345.1
123456789123456

无效示例

1234567891234567
123.1234
1.12345
.1234

我怎样才能做到这一点?

4

3 回答 3

4

首先,字符.被称为点,或句点,或句号,或小数点,而逗号是字符:,.

其次,您可以在字符类的正则表达式中指定一个数字:[0-9]表示 0 到 9 之间的任何数字。

正则表达式中的点将匹配任何字符,因此您需要通过反斜杠(或将其放入字符类)对其进行转义。

请记住,同一字符类中的元素可以按任何顺序排列,因此如果您想获得具有数字和点的东西并使用[0-9.]它,它将匹配任何数字或点。

现在,您将需要用于任务的有限量词,它们由大括号以最小值和最大值{m,n}的形式指定。如果您现在使用... ,则意味着字符类重复 1 到 15 次。mn[0-9.]{1,15}[0-9.]

但是如果你使用[0-9.]{1,15},它也会匹配......or 1234(记得我之前说过顺序无关紧要。

因此,应用所有这些,您将获得正则表达式:

[0-9]{1,15}\.[0-9]{1,3}

现在,由于您正在进行验证,您将需要锚点来指定正则表达式应该测试整个字符串(而不是简单地找到匹配项)。

^[0-9]{1,15}\.[0-9]{1,3}$

最后,因为你可以有可选的小数,你将不得不使用一个组和量词?,这意味着 0 或 1:

^[0-9]{1,15}(?:\.[0-9]{1,3})?$

在您的代码中,您将像这样创建正则表达式:

string myString = "123456789.123";
var regexp = new Regex(@"^[0-9]{1,15}(?:\.[0-9]{1,3})?$");
var setMatches = regexp.Matches(myString);
foreach (Match match in setMatches)
{
    Console.WriteLine(match.Groups[0].Value);
}

如果它通过了正则表达式,这将输出小数。

或者是这样的:

string myString = "123456789.123";
Match match = Regex.Match(myString, @"^[0-9]{1,15}(?:\.[0-9]{1,3})?$");
if (match.Success)
{
    Console.WriteLine(match.Groups[0].Value);
}
于 2013-09-29T10:12:50.420 回答
1

这个正则表达式应该适合你:

/^\d{1,15}(\.\d{1,3})?$/

在 Java 中:

Pattern p = Pattern.compile("^\\d{1,15}(\\.\\d{1,3})?$");
于 2013-09-29T10:08:22.623 回答
0

尝试这个

  String str="Your input";
    Pattern pattern = Pattern.compile("^\\d{1,15}($|(\\.\\d{1,3}$))");
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        System.output.Println(matcher.group());
    }

在 c# 中试试这个

    MatchCollection mc = Regex.Matches("your text", "^\d{1,15}($|(\.\d{1,3}$))");
             foreach (Match m in mc)
             {
                Console.WriteLine(m);
            }
于 2013-09-29T09:54:43.740 回答