public RangeGroup GetRanges() { if (string.IsNullOrEmpty(Text) || !Text.Contains("#{")) { return(null); } var matches = RangeRegexp.Matches(Text); if (matches.Count == 0) { return(null); } if (matches.Count > 1) { throw new DeveloperException("В одном поле не должно быть более одного 'range'"); } var match = matches[0]; var res = new RangeGroup(); res.ExpressionText = match.Value; var nameMatch = match.Groups["name"]; if (nameMatch.Success) { res.Name = nameMatch.Value; } var rangesMatch = match.Groups["ranges"]; if (!rangesMatch.Success) { throw new DeveloperException(string.Format("Невозможно прочитать диапазоны в выражении '{0}'", Text)); } // вычисляем диапазоны var values = rangesMatch.Value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var ranges = new Range[values.Length]; try { for (int i = 0; i < values.Length; i++) { var rangeIdx = values[i].IndexOf('-'); if (rangeIdx == -1) { var idx = int.Parse(values[i]); ranges[i] = new Range(idx, idx); } else { var left = int.Parse(values[i].Substring(0, rangeIdx)); var right = int.Parse(values[i].Substring(rangeIdx + 1)); ranges[i] = new Range(left, right); } } } catch (FormatException ex) { throw new Exception(string.Format("Неправильный формат в формуле '{0}'.", res.ExpressionText), ex); } res.Ranges.AddRange(ranges); return(res); }
public void SetRangeValue(RangeGroup rangeGroup, string value) { Text = Text.Replace(rangeGroup.ExpressionText, value); }