Я хочу проверить входную строку так, чтобы
5.0 is correct 5.5% is correct
Поэтому я начал со следующего кода:
string decimalstring1 = "10000.55"; string decimalstring2 = "5%5%"; string expression = @"^\d|\d%"; Regex objNotNumberPattern = new Regex(expression); Console.WriteLine(objNotNumberPattern.IsMatch(decimalstring1)); Console.WriteLine(objNotNumberPattern.IsMatch(decimalstring2)); Console.ReadLine();
Но проблема в том, что при вводе, например, 5% 5%, он дает correct
Как я могу изменить это выражение, чтобы сделать эту работу?
string[] inputs = new string[] { "1000.55", "1000.65%", "100", "100%", "1400%", "5.5", "5.5%", "x", ".%" }; string expression = @"^\d+[.]?\d*%?$"; Regex objNotNumberPattern = new Regex(expression); foreach (var item in inputs) Console.WriteLine(objNotNumberPattern.IsMatch(item));
ОБНОВИТЬ
string expression = @"^(\d+|\d+[.]\d+)%?$";
Вы получаете частичные совпадения, потому что ваше выражение не привязывает обе стороны. Ваше регулярное выражение закрепляет начало, но не конец матча.
Более того, размещение левого якоря ^
неверно, поскольку оно применяется только к левому подвыражению
Добавление $
в конце должно помочь:
^(\d|\d%)$
Однако это субоптимально: поскольку префикс обоих выражений один и тот же, и они отличаются дополнительным суффиксом %
, вы можете использовать %?
для упрощения выражения:
^\d+%?$
Это лучше, но не соответствует десятичной точке. Чтобы добавить эту возможность, измените выражение следующим образом:
^(\d+|\d*[.]\d+)%?$
Вы являетесь следующим выражением: match, если вы найдете одно из следующих значений: одну цифру в начале входной строки или одну цифру в любом месте, за которой следует%. Наверное, не то, что вы намеревались. Я бы попробовал что-то вроде этого:
var expression = @"^\d+(\.\d+)?%?$";
Это будет означать: сопоставление положительного числа цифр в начале строки, необязательно сопровождаемое точкой и любым количеством цифр (дробная часть), необязательно заканчивающееся знаком%.
Вы можете попробовать это ^\d+([.]\d+)?%?$
Которое работает с: (проверено)
1000.55 1000.65% 100 100% 1400% 5.5 5.5%
Надеюсь, поможет!
я думаю, что это лучший:
^\d{0,2}(\.\d{1,4})? *%?$
источник: здесь
это сработало для меня:
/(^100([.]0{1,2})?)$|(^\d{1,2}([.]\d{0,2})?)$/
Всего два десятичных знака и не более 100 [0,00 – 100,00]