// handles complex option switches // RX for splitting comma seperated values: // http://dotnetslackers.com/Regex/re-19977_Regex_This_regex_splits_comma_or_semicolon_separated_lists_of_optionally_quoted_strings_It_hand.aspx // @"\s*[;,]\s*(?!(?<=(?:^|[;,])\s*""(?:[^""]|""""|\\"")*[;,])(?:[^""]|""""|\\"")*""\s*(?:[;,]|$))" // http://regexlib.com/REDetails.aspx?regexp_id=621 // @",(?!(?<=(?:^|,)\s*\x22(?:[^\x22]|\x22\x22|\\\x22)*,)(?:[^\x22]|\x22\x22|\\\x22)*\x22\s*(?:,|$))" /// <summary> /// Gets the complex options. /// </summary> /// <param name="rawParameterList"> The raw parameter list. </param> /// <returns> </returns> /// <remarks> /// </remarks> public static IEnumerable <ComplexOption> GetComplexOptions(this IEnumerable <string> rawParameterList) { var optionList = new List <ComplexOption>(); foreach (var p in rawParameterList) { var m = Regex.Match(p, @"\[(?>\"".*?\""|\[(?<DEPTH>)|\](?<-DEPTH>)|[^[]]?)*\](?(DEPTH)(?!))"); if (m.Success) { var co = new ComplexOption(); var v = m.Groups[0].Value; var len = v.Length; co.WholePrefix = v.Substring(1, len - 2); co.WholeValue = p.Substring(len); var parameterStrings = Regex.Split(co.WholePrefix, @",(?!(?<=(?:^|,)\s*\x22(?:[^\x22]|\x22\x22|\\\x22)*,)(?:[^\x22]|\x22\x22|\\\x22)*\x22\s*(?:,|$))"); foreach (var q in parameterStrings) { v = q.Trim(); if (v[0] == '"' && v[v.Length - 1] == '"') { v = v.Trim('"'); } co.PrefixParameters.Add(v); } var values = co.WholeValue.Split('&'); foreach (var q in values) { var pos = q.IndexOf('='); if (pos > -1 && pos < q.Length - 1) { co.Values.Add(q.Substring(0, pos).UrlDecode(), q.Substring(pos + 1).UrlDecode()); } else { co.Values.Add(q.Trim('='), ""); } } optionList.Add(co); } } return(optionList); }
// handles complex option switches // RX for splitting comma seperated values: // http://dotnetslackers.com/Regex/re-19977_Regex_This_regex_splits_comma_or_semicolon_separated_lists_of_optionally_quoted_strings_It_hand.aspx // @"\s*[;,]\s*(?!(?<=(?:^|[;,])\s*""(?:[^""]|""""|\\"")*[;,])(?:[^""]|""""|\\"")*""\s*(?:[;,]|$))" // http://regexlib.com/REDetails.aspx?regexp_id=621 // @",(?!(?<=(?:^|,)\s*\x22(?:[^\x22]|\x22\x22|\\\x22)*,)(?:[^\x22]|\x22\x22|\\\x22)*\x22\s*(?:,|$))" public static IEnumerable<ComplexOption> GetComplexOptions(this IEnumerable<string> rawParameterList) { var optionList = new List<ComplexOption>(); foreach(string p in rawParameterList) { var m = Regex.Match(p, @"\[(?>\"".*?\""|\[(?<DEPTH>)|\](?<-DEPTH>)|[^[]]?)*\](?(DEPTH)(?!))"); if(m.Success) { var co = new ComplexOption(); var v = m.Groups[0].Value; var len = v.Length; co.WholePrefix = v.Substring(1, len - 2); co.WholeValue = p.Substring(len); var parameterStrings = Regex.Split(co.WholePrefix, @",(?!(?<=(?:^|,)\s*\x22(?:[^\x22]|\x22\x22|\\\x22)*,)(?:[^\x22]|\x22\x22|\\\x22)*\x22\s*(?:,|$))"); foreach(string q in parameterStrings) { v = q.Trim(); if(v[0] == '"' && v[v.Length - 1] == '"') { v = v.Trim('"'); } co.PrefixParameters.Add(v); } var values = co.WholeValue.Split('&'); foreach(string q in values) { var pos = q.IndexOf('='); if(pos > -1 && pos < q.Length - 1) { co.Values.Add(q.Substring(0, pos).UrlDecode(), q.Substring(pos + 1).UrlDecode()); } else { co.Values.Add(q.Trim('='), ""); } } optionList.Add(co); } } return optionList; }
public void ComplexOptionConstructorTest() { ComplexOption target = new ComplexOption(); Assert.Inconclusive("TODO: Implement code to verify target"); }