Регулярные выражения, проверка строк на соответсвие c#

Возникли вопросы по регулярным выражениям. Данный метод производит проверку строк на соответствие формату.
К примеру:
обычная нотация - 3.5;
научная нотация - 5*10, 5e5;
Не число - любые буквы.

static void FindNotation(string number)
        {
            string simpleNumber = @"^-*[0-9,\.]+$";
            string scientificNumber = @"^-*[0-9,\.\d[e|\D\d]+$";

            if (Regex.IsMatch(number, simpleNumber, RegexOptions.IgnoreCase))
                Console.WriteLine("Это число в обычной нотации");
            else if (Regex.IsMatch(number, scientificNumber, RegexOptions.IgnoreCase))
                Console.WriteLine("Это число в научной нотации");
            else 
                Console.WriteLine("Это не число!");
        } 

При вводе чисел из обычной и научной нотации, метод срабатывает корректно. При вводе букв, он всегда совпадает с регулярным выражением @"^-*[0-9,\.\d[e|\D\d]+$"; Можете подсказать в чем ошибка моего выражения? Либо где можно почитать более подробно об этом.


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Описание значения регулярных выражений доступно на английском языке на Regex101.com. Ваше регулярное выражение состоит из следующих частей:

  • ^ - начало строки
  • -* - 0 и более дефисов
  • [0-9,\.\d[e|\D\d]+ - один и более любых символов, так как
    • 0-9 - находит любую цифру
    • , - запятую
    • \. - точку
    • \d - опять цифру
    • [ - символ [
    • e - букву e
    • | - знак |
    • \D - любую не-цифру
    • \d - опять цифру
  • $ - конец строки.

Как видите, [0-9,\.\d[e|\D\d]+ = [\D\d]+ = (?s).+, то есть это тот самый шаблон, который находит любой непустой текст.

Возможно, вам следует использовать

^[+-]?\d*\.?\d+(?:[eE][+-]?\d+)?$

См. пример работы выражения. 5*10 оно не найдет, правда, это не похоже на число.

Подробности

  • ^ - начало строки
  • [+-]? - необязательный символ + или -
  • \d*\.?\d+ - 0 и более цифр, необязательная точка, 1 и более цифр
  • (?: - начало необязательной незахватывающей подмаски:
    • [eE] - e или E
    • [+-]? - необязательный символ + или -
    • \d+ - 1 и более цифр
  • )? - один или ноль повторов
  • $ - конец строки.
→ Ссылка