Регулярное выражение для проверки процента

Я хочу проверить входную строку так, чтобы

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]