public static bool TryParse(string input, out ContentRangeHeaderValue parsedValue) { parsedValue = null; var lexer = new Lexer(input); var t = lexer.Scan(); if (t != Token.Type.Token) { return(false); } var value = new ContentRangeHeaderValue(); value.unit = lexer.GetStringValue(t); t = lexer.Scan(); if (t != Token.Type.Token) { return(false); } long nvalue; if (!lexer.IsStarStringValue(t)) { if (!lexer.TryGetNumericValue(t, out nvalue)) { var s = lexer.GetStringValue(t); if (s.Length < 3) { return(false); } var sep = s.Split('-'); if (sep.Length != 2) { return(false); } if (!long.TryParse(sep[0], NumberStyles.None, CultureInfo.InvariantCulture, out nvalue)) { return(false); } value.From = nvalue; if (!long.TryParse(sep[1], NumberStyles.None, CultureInfo.InvariantCulture, out nvalue)) { return(false); } value.To = nvalue; } else { value.From = nvalue; t = lexer.Scan(recognizeDash: true); if (t != Token.Type.SeparatorDash) { return(false); } t = lexer.Scan(); if (!lexer.TryGetNumericValue(t, out nvalue)) { return(false); } value.To = nvalue; } } t = lexer.Scan(); if (t != Token.Type.SeparatorSlash) { return(false); } t = lexer.Scan(); if (!lexer.IsStarStringValue(t)) { long lvalue; if (!lexer.TryGetNumericValue(t, out lvalue)) { return(false); } value.Length = lvalue; } t = lexer.Scan(); if (t != Token.Type.End) { return(false); } parsedValue = value; return(true); }