Как бы мне ни нравились регулярные выражения, если вы будете часто делать это в своей программе, вам будет лучше с небольшим классом для представления ваших токенов. Считайте это грубым наброском:
public class SamToken
{
public string Head { get; set; }
private readonly HashSet<string> properties;
public HashSet<string> Properties{
get{return properties; }
}
public SamToken() : this("") { }
public SamToken(string head)
{
Head = head;
properties = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
}
public void Add(params string[] newProperties)
{
if ((newProperties == null) || (newProperties.Length == 0))
return;
properties.UnionWith(newProperties);
}
public override string ToString()
{
return String.Format("{0}[{1}]", Head,
String.Join("|", Properties));
}
}
Далее, вы можете использовать функцию для разбора токена из строки, что-то из строки:
public static SamToken Parse(string str)
{
if (String.IsNullOrEmpty(str))
return null;
Match match = Regex.Match(str, @"^(\w*)\[([\w|]*)\]$");
if (!match.Success)
return null;
SamToken token = new SamToken(match.Groups[1].Value);
token.Add(match.Groups[2].Value.Split('|'));
return token;
}
С чем-то вроде этого было бы легко добавить свойства:
SamToken token = SamToken.Parse("span[hello|world]");
token.Add("style", "class");
string s = token.ToString();
Как видите, я потратил всего несколько минут, но ваш код может быть гораздо более надежным и, что более важно, многократно используемым. Вам не нужно переписывать это регулярное выражение каждый раз, когда вы хотите проверить или добавить свойство.