Один из способов решения этой проблемы:
- Используйте RegEx для возврата совпадений шаблона
(x,y)
. - Используйте методы расширения для извлечения
x
и y
. - Проверьте, относятся ли
x
и y
к типу decimal
, используя метод decimal.TryParse(..)
. - Проверьте, содержит ли входная строка что-то другое, кроме требуемого шаблона .
private bool IsValidInput(string input)
{
var pattern = @"\((.*?)\s?,\s?(.*?)\)";
var xpatt = @"\s+\(|\s+\)|\,\(|\)\,|\)\s+|\({2,}|\){2,}|^\)\(|\)\($";
var q = Regex.Matches(input, pattern)
.Cast<Match>()
.SelectMany(x => x.Groups.Cast<Group>()
.Skip(1))
.Select(x => x.Value);
return !Regex.IsMatch(input, xpatt)
&& q.Count() > 0
&& input.Replace(" ","").Length
== (input.Count(x => x == '(' || x == ')' || x == ',')
+ q.Sum(x => x.Length))
&& q.All(x => decimal.TryParse(x, out _));
}
Итак, функция возвращает:
(1.01, 3.21)(3.01, 4.51)(2.1, 5.6) => true
(abc, 3.21)(3.01, 4.51)(2.1, 5.6) => false
(3.21)(3.01, 4.51)(2.1, 5.6) => false
1.01, 3.2 13.01, 4.51 2.1, 5.6 => false
1.01, 3.21)(3.01, 4.51)(2.1, 5.6) => false
(1.01, 3.21)(3.01, 4.51)(2.1, 5.6 => false
1.01, 3.21)3.01, 4.51)2.1, 5.6) => false
(1.01, 3.21)3.01, 4.51(2.1, 5.6) => false
(1.01, 3.21)abc(3.01, 4.51)(2.1, 5.6) => false
(1.01, 3.21)(3.01, 4.51)abc(2.1, 5.6) => false
abc(1.01, 3.21)(3.01, 4.51)(2.1, 5.6) => false
(1.01, 3.21)(3.01, 4.51)(2.1, 5.6)abc => false