регулярное выражение в .net для проверки числа - PullRequest
0 голосов
/ 11 сентября 2009

Мне нужно регулярное выражение в .net, которое

  • будет разрешать максимум две цифры после "."
  • будет разрешать максимум две цифры перед "."
  • имеет максимальную длину 5
  • представляет число больше 0
  • представляет число не более 100
  • имеет номер не больше 11 после ".", Например 5.11, 5.10, 5.03, 5.01, 5.06 и т. Д. (Не 5.12, 5.2, 5.3)

Примеры:

  • 1, 100, 100,00, 58, 58,10, 1,1, 0,02, 0,2, 0,02, 1,02, 11,11, 12,00, 01,09, 1,0 и т. Д.

Неверные номера:

  • 1,12, 101,12, 100,1, 100,03, 100,65 и т. Д. И все отрицательные значения

Ответы [ 5 ]

2 голосов
/ 11 сентября 2009
^100\.00|\d{1,2}\.(?:11|10|0\d)$

ОК, было проще, чем я думал.

^100(?:\.00?)?$|^(?:\d{1,2})?(?:\.(?:1|11|10|0\d?))?$

Это соответствует новому набору данных. Это также соответствует .0 на данный момент.

1 голос
/ 11 сентября 2009

это регулярное выражение основано на одном из Xetius:

^(100(?:\.00?)?|\d{1,2}(?:\.(?:11|10|0\d|0|1))?)$

ниже приведен код, как я его протестировал:

class Program
{
    const string Pattern = @"^(100(?:\.00?)?|\d{1,2}(?:\.(?:11|10|0\d|0|1))?)$";
    static void Main(string[] args)
    {
        for (int before = 0; before < 100; before++)
        {
            Test(before.ToString());
            for (int after = 0; after < 12; after++)
            {
                Test(string.Format("{0}.{1:d2}", before, after));
                Test(string.Format("{0:d2}.{1:d2}", before, after));
                Test(string.Format(".{0:d2}", after));
            }
            Test(string.Format("{0}.{1:d}", before, 0));
            Test(string.Format("{0:d2}.{1:d}", before, 1));
        }
        // Special cases:
        Test("100");
        Test("100.0");
        Test("100.00");

        // intended to fail
        Test("00.20");
        Test("00.12");
        Test("00.00x");
        Test("000.00");
        Console.WriteLine("done.");
        Console.ReadLine();
    }

    private static void Test(string input)
    {
        Regex r = new Regex(Pattern);
        if (!r.IsMatch(input))
        {
            Console.WriteLine("no match: " + input);
        }
    }
}

Edit:

  • Настроил регулярное выражение, чтобы 100.0 также работало
  • добавил комментарий к тестам, предназначенным для отказа

Edit2:

  • Добавил Test для .00 - .11 и был удивлен, что регулярное выражение уже соответствует им. Благодаря Xetius
0 голосов
/ 11 сентября 2009
^(?:\d{1,2}(?:\.(?:0?\d|1[01]))?|100)$
0 голосов
/ 11 сентября 2009
"^100(\.00?)?|\d\d?(\.(1[01]?|0\d?))?$"
0 голосов
/ 11 сентября 2009

^(100(\.00?)?|\d\d?(\.(0\d|1[01]?))?)$

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...