2013-11-27 4 views
1

У меня есть эта RegEx для проверки C# ASP.NET MVC3 Model:Процент Regex с запятой

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

Это работает почти во всех случаях, за исключением, если число превышает 100. любое число больше 100 должно показать ошибку. Я уже пробовал использовать [Диапазон], но он не работает с запятыми.

Действительно: 0/0,0/0,00 - 100/100,0/100,00.

Недействительный (номер> 100).

+0

Как вы получили это значение? Почему не работает 'int.TryParse()'? – paqogomez

+1

В дополнение к предложению @paqogomez вы можете увидеть его в действии здесь: http://stackoverflow.com/questions/1824326/convert-toint32-a-string-with-commas – brandonscript

ответ

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

Вам нужно включить начало и конец строковых элементов управления , в противном случае он будет по-прежнему соответствовать большим числам. Быстро и грязно, "^ (?: 100 | [0-9] {1,2}) ($ |, 0 {1,2}) $" работает. – neilh

+0

OP не показывал якоря^$ в примере. Я тоже этого не сделаю. И быстрое и грязное регулярное выражение запутывает якоря, затрудняющие чтение, тогда как^(?: 100 | [0-9] {1,2}) (?:, 0 {1,2})? $ В порядке, потому что обратное слежение на самом деле некуда идти. – sln

+1

И у меня нет голосов здесь, поэтому ... – sln

1

Вот RegEx, который соответствует вашим критериям:

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

(Учитывая ваш случай использования, я предположил, что последовательность вашего персонажа появляется сам по себе и не встроен в другом содержимом. Пожалуйста, дайте мне знать, если это не так.)

А вот 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] 
+0

Это именно то, что я ищу, спасибо! – WagnerMaurer

+2

Одна вещь, которую устанавливает OP: 'Valid: 0,00 - 100'. Я могу только предположить, что> 100 будет '100.99', которое соответствует вашему регулярному выражению. Возможно, вы можете предусмотреть это с небольшой модификацией - '^ (?: [0-9] | [1-9] [0-9] | 100 (? = (?:, 0 {1,2})? $)) (?:, [0-9] {1,2})? $ ', +1 В любом случае – sln

+0

@sln - Вы правы. И ваше регулярное выражение работает отлично! Тем не менее, я пересмотрел свое регулярное выражение несколько иначе, так что завершение '$' появлялось только один раз. Мой подход: ** A) ** Сначала проверьте одну или две цифры и необязательную дробную часть, а затем ** B) ** проверьте номер '100' и ​​его необязательную дробную часть (которая может состоять из одного или только два нуля). Я также включил дополнительные образцы данных. Если вы видите какие-либо недостатки в моем пересмотре regex vs.ваш, пожалуйста, дайте мне знать. – DavidRR

Смежные вопросы