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
,
http://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);
/// Regular expression to isolate an ID ("$1") or lookup value ("$2")
/// Use this for "Lookup" fields, or for "Person or Group" fields
/// 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+);#(.*)$",
/// Regular expression to isolate a URL ("$1") or its Description ("$2")
/// string UrlField, UrlPath, UrlName;
/// if (Util.rexUrlField.Match(UrlField).Success)
/// UrlPath = Util.rexUrlField.Match(UrlField).Result("$1");
/// UrlName = Util.rexUrlField.Match(UrlField).Result("$2");
internal static System.Text.RegularExpressions.Regex rexUrlField =
new System.Text.RegularExpressions.Regex(@"^(.*), +(.*)$",
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!!