user195488
user195488

Reputation:

RegEx for ranges

I want to be able to use a RegEx to parse out ranges like a Windows Print dialog (such as 1-50,100-110,111,112). The following is my current code and I am not clear on how to parse for the additional commas and numbers. I can parse out the hyphen, but not sure how to do it for additional commas or hyphens

private void tboxRowNum_Leave(object sender, EventArgs e)
{
    Regex.Replace(tboxRowNum.Text, @"(?<first>\d+)-(?<last>\d+)",
    new MatchEvaluator(this.parseSpaceDefinition));

}

private string parseSpaceDefinition(Match m)
{
    int first = int.Parse(m.Groups["first"].Value);
    int last = int.Parse(m.Groups["last"].Value);
    StringBuilder sb = new StringBuilder(first.ToString());

    for (int i = first + 1; i <= last; i++)
    {
        if (spaceItems == 0)
        {
            if (isNumeric(sb.ToString(),  System.Globalization.NumberStyles.Integer))
            {
                startingSpace = Convert.ToInt32(sb.ToString());
            }
        }

        sb.Append("," + i.ToString().Replace(" ", ""));

        spaceItems++;
        endingSpace = i;
    }

    tboxRowDesc.Text = sb.ToString();
    return sb.ToString();
}

Edit 1: The modified code gets me what I want:

private void tboxRowNum_Leave(object sender, EventArgs e)
{
    string[] parts = tboxRowNum.Text.Split(',');

    for (int i = 0; i < parts.Length; i++)
    {
        if (parts[i].IndexOf('-') >= 0)
        {
            Regex.Replace(parts[i], @"(?<first>\d+)-(?<last>\d+)",
            new MatchEvaluator(this.parseSpaceDefinition));
        }
        else
        {
            int number;
            if(!(int.TryParse(parts[i], out number))) 
            {
                MessageBox.Show("Incomplete/Invalid formula", "Invalid Space Definition");
                tboxRowDesc.Text = "";
            }
            else 
            {
                tboxRowDesc.Text += "," + number;
                spaceItems++;
            }
        }
    }
}

Upvotes: 0

Views: 193

Answers (2)

DevDevDev
DevDevDev

Reputation: 5177

string[] ranges = inputString.split(',');

foreach (string rangeCandidate in ranges) {
   // See if matches regex
}

Upvotes: 3

Mark Byers
Mark Byers

Reputation: 838226

Split it first on comma, and for each part check if it matches your regexp. If it does, do what you are already doing, otherwise just use int.Parse (or int.TryParse for robustness).

Upvotes: 1

Related Questions