using System; using System.Text.RegularExpressions; public class Test { public static void Main() { var pattern = @"^(?=\d+[a-z]+(?:-\d+[a-z]+)*$)(?>(?<gal>\d+)gal-?)?(?>(?<qt>\d)+qt-?)?(?>(?<pt>\d+)pt-?)?(?>(?<cup>\d+)cup-?)?(?>(?<oz>\d+)oz-?)?$"; string[] strings = {"1gal-1qt-2pt-2cup-5oz", "1gal-6oz", "1gal"}; foreach (string s in strings) { var regex = new Regex(pattern); GroupCollection groups = regex.Match(s).Groups; foreach (string groupName in regex.GetGroupNames()) { Console.WriteLine("Group: {0}, Value: {1}", groupName, groups[groupName].Value); } Console.WriteLine("===================================="); } } }
Standard input is empty
Group: 0, Value: 1gal-1qt-2pt-2cup-5oz Group: gal, Value: 1 Group: qt, Value: 1 Group: pt, Value: 2 Group: cup, Value: 2 Group: oz, Value: 5 ==================================== Group: 0, Value: 1gal-6oz Group: gal, Value: 1 Group: qt, Value: Group: pt, Value: Group: cup, Value: Group: oz, Value: 6 ==================================== Group: 0, Value: 1gal Group: gal, Value: 1 Group: qt, Value: Group: pt, Value: Group: cup, Value: Group: oz, Value: ====================================