用逗号表示的正则表达式百分比

时间:2013-11-27 18:38:30

标签: c# regex asp.net-mvc-3 validation data-annotations

我有这个RegEx用于C#ASP.NET MVC3模型验证:

[RegularExpression(@"[0-9]*\,?[0-9]?[0-9]")]

这适用于几乎所有情况,除非数字大于100。 任何大于100的数字都应显示错误。 我已经尝试过使用[Range],但它不能用逗号。

  

有效期:0 / 0,0 / 0,00 - 100 / 100,0 / 100,00。

     

无效(数字> 100)。

2 个答案:

答案 0 :(得分:2)

不确定零是否只是末尾的可选数字,而是

 #  (?:100(?:,0{1,2})?|[0-9]{1,2}(?:,[0-9]{1,2})?)

 (?:
      100 
      (?: , 0{1,2} )?
   |  
      [0-9]{1,2} 
      (?: , [0-9]{1,2} )?
 )

归零时唯一的选项

 #  (?:100|[0-9]{1,2})(?:,0{1,2})?

 (?:
      100 
   |  [0-9]{1,2} 
 )
 (?: , 0{1,2} )?

并且,除了零本身之外没有前导零的排列

 # (?:100(?:,0{1,2})?|(?:0|[1-9][0-9]?)(?:,[0-9]{1,2})?) 

 (?:
      100 
      (?: , 0{1,2} )?
   |  
      (?:
           0
        |  
           [1-9] [0-9]? 
      )
      (?: , [0-9]{1,2} )?
 )


 # (?:100|0|[1-9][0-9])(?:,0{1,2})? 

 (?:
      100 
   |  
      0
   |  
      [1-9] [0-9] 
 )
 (?: , 0{1,2} )?

答案 1 :(得分:2)

这是符合您条件的 RegEx

^(?:(?:[0-9]|[1-9]{1,2})(?:,[0-9]{1,2})?|(?:100)(?:,0{1,2})?)$

(考虑到您的使用案例,我假设您的角色序列单独出现并且嵌入其他内容。如果情况并非如此,请告诉我。)< / em>的

这是一个 Perl 程序,用于演示样本数据集上的RegEx。 (另见live demo。)

#!/usr/bin/env perl

use strict;
use warnings;

while (<DATA>) {
    chomp;

    # A1 => An integer between 1 and 99, without leading zeros.
    #      (Although zero can appear by itself.)
    #
    # A2 => A optional fractional component that may contain no more
    #       than two digits.
    #
    # -OR-
    #
    # B1 => The integer 100.
    #
    # B2 => A optional fractional component following that may
    #       consist of one or two zeros only.
    #

    if (/^(?:(?:[0-9]|[1-9]{1,2})(?:,[0-9]{1,2})?|(?:100)(?:,0{1,2})?)$/) {
    #           ^^^^^^^^A1^^^^^^    ^^^^^A2^^^^      ^B1    ^^^B2^^

        print "* [$_]\n";
    } else {
        print "  [$_]\n";
    }
}

__DATA__
0
01
11
99
100
101
0,0
0,00
01,00
0,000
99,00
99,99
100,0
100,00
100,000
100,01
100,99
101,00

预期输出

* [0]
  [01]
* [11]
* [99]
* [100]
  [101]
* [0,0]
* [0,00]
  [01,00]
  [0,000]
* [99,00]
* [99,99]
* [100,0]
* [100,00]
  [100,000]
  [100,01]
  [100,99]
  [101,00]