Регулярные выражения, проверка строк на соответсвие 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 шт):
Описание значения регулярных выражений доступно на английском языке на 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 и более цифр
)?- один или ноль повторов$- конец строки.