Parsing multi-value fields - MultiChoice, Lookup, User, URL. Rules for the ";#" delimiter.
For certain types of columns (aka fields), SharePoint stores several values in one field, using a delimiter to separate the different values.
Column Type |
Items |
Delimiter |
Example |
Choices , configured as Display choices using Checkboxes (allow multiple selections ) |
All selected choices |
;# |
;#First;#Second;#Third;# |
Lookup |
Item index, lookup value |
;# |
1;#First |
Person or Group |
Item index, user value |
;# |
42;#Mark Arend |
Hyperlink or Picture |
URL, text link |
, |
https://microsoft.com, Microsoft |
Whenever parsing’s involved, I like to use regular expressions, even if I’m just extracting a single substring. This way, I can maintain all my parsing instructions in one place, making it easy to fix problems like missing a boundary case in my original understanding of the parse.
Below are three regular expressions that parse the above column types. I usually make these static members of a class named Util, so I can call them easily throughout my code. The code samples include commented examples of using each regular expression.
/// <summary>
/// Regular expression to isolate multi-choice values
/// </summary>
/// <example>
// System.Text.RegularExpressions.Match choice;
// string strField;
// foreach (SPListItem item in list.Items)
// {
// strField = (string)item["MultiChoiceField"];
// output.Append(item.Title + ": " + strField + "<BR>");
// if (strField != null)
// {
// choice = Util.rexMultiChoiceField.Match(strField);
// while (choice.Success)
// {
// output.Append("- " + choice.Result("$1") + "<BR>");
// choice = choice.NextMatch();
// }
// }
// }
///// </example>
internal static System.Text.RegularExpressions.Regex rexMultiChoiceField =
new System.Text.RegularExpressions.Regex(@"#(.+?);",
System.Text.RegularExpressions.RegexOptions.Compiled);
/// <summary>
/// Regular expression to isolate an ID ("$1") or lookup value ("$2")
/// Use this for "Lookup" fields, or for "Person or Group" fields
/// </summary>
/// <example>
/// string LookupField, LookupId, LookupValue;
/// if (Util.rexLookupField.Match(LookupField).Success)
/// {
/// LookupId = Util.rexLookupField.Match(LookupField).Result("$1");
/// LookupValue = Util.rexLookupField.Match(LookupField).Result("$2");
/// }
/// </example>
internal static System.Text.RegularExpressions.Regex rexLookupField =
new System.Text.RegularExpressions.Regex(@"(\d+);#(.*)$",
System.Text.RegularExpressions.RegexOptions.Compiled);
/// <summary>
/// Regular expression to isolate a URL ("$1") or its Description ("$2")
/// </summary>
/// <example>
/// string UrlField, UrlPath, UrlName;
/// if (Util.rexUrlField.Match(UrlField).Success)
/// {
/// UrlPath = Util.rexUrlField.Match(UrlField).Result("$1");
/// UrlName = Util.rexUrlField.Match(UrlField).Result("$2");
/// }
/// </example>
internal static System.Text.RegularExpressions.Regex rexUrlField =
new System.Text.RegularExpressions.Regex(@"^(.*), +(.*)$",
System.Text.RegularExpressions.RegexOptions.Compiled);
See also the SPListItem Class discussion in the SDK for additional samples. If you know of better details regarding these delimited value fields, please post replies. Thanks!!