Некорректное сравнение строк, происходящее с регулярным выражением

#c#

#c#

Вопрос:

Я пытаюсь использовать регулярное выражение для проверки моих строковых данных, но регулярное выражение, похоже, не работает, это означает, что оно выдает неверный вывод.

Я хочу принимать данные, подобные этому :

 Number 
Number.Number 
  

Вот данные, которые я хотел бы принять :

 2.5  
2.5
2 
2
  

Недопустимые данные :

 2..5
 2.
  

Код :

 class Program
{
        static void Main(string[] args)
        {
           string s = "2.5 ";
           var isValid = Regex.IsMatch(s, @"(^[0-9]{1,2}.?[0-9]? ?$)");
        }
}
  

Комментарии:

1. Ваше регулярное выражение выглядит немного с привкусом perl. В .net вам это не нужно /[regex]/ . Но ваше регулярное выражение работает для меня, как вы можете видеть здесь . Я просто добавил $ в конец, чтобы предотвратить захват допустимых частей в начале строки.

2. @Pretasoc По-прежнему я получаю ложное значение с помощью предложенного вами регулярного выражения.Regex. IsMatch возвращает false при вводе 2,5

3. Я не могу воспроизвести ошибку.

4. Пожалуйста, напишите и опубликуйте короткую, полную программу, которую мы можем вырезать и вставить в Visual Studio, которая четко демонстрирует проблему.

5. Тем не менее, ваше регулярное выражение по-прежнему неверно. Он принимает 000 и 2. , которые, я думаю, вы не намерены принимать, верно?

Ответ №1:

Здесь позвольте мне показать вам, как написать полезный репродуктор:

 using System;
using System.Text.RegularExpressions;
public class Program
{
  public static void Main(string[] args)
  {
    string pattern = @"(^[0-9]{1,2}.?[0-9]? ?$)";
    // These should be true, and they are.
    Console.WriteLine(Regex.IsMatch("2.5 ", pattern));
    Console.WriteLine(Regex.IsMatch("2.5 ", pattern));
    Console.WriteLine(Regex.IsMatch("2 ", pattern));
    Console.WriteLine(Regex.IsMatch("2", pattern));
    // These should be false, and they are.
    Console.WriteLine(Regex.IsMatch("2..5", pattern));
    Console.WriteLine(Regex.IsMatch(" 2.", pattern));
    // These should be false, but are true because 
    // the pattern is wrong.
    Console.WriteLine(Regex.IsMatch("2.", pattern));
    Console.WriteLine(Regex.IsMatch("000", pattern));
  }
}
  

Когда я запускаю эту программу, я получаю именно то поведение, которое ожидается, поэтому никакого воспроизведения. Если вы получаете разные результаты на своем компьютере, действительно происходит что-то очень странное; какие результаты вы получаете на своем компьютере?

Если вопрос в том, «как я могу исправить ошибку в моем регулярном выражении, чтобы оно не совпадало 000 и 2. ?», вы можете сделать это с помощью (^[0-9]{1,2}(.[0-9])? ?$)

Комментарии:

1. Большое вам спасибо за ваше драгоценное время и за ваши добрые усилия, направленные на то, чтобы помочь мне. Приветствуется :). Да, действительно, я не хотел принимать 000 и 2. и я так счастлив, что наконец-то получил от вас ответ 🙂

Ответ №2:

Это регулярное выражение работает для всех опубликованных вами данных. Если вы допускаете более одной цифры после точки, вы должны добавить желаемый квантификатор после второй [0-9]

 var isValid = Regex.IsMatch(s, @"^[0-9]{1,2}(.[0-9])? ?$");
  

Комментарии:

1. Проголосовал против за ваши добрые усилия по оказанию мне помощи и за ваше драгоценное время. Приветствуется 🙂