Я использую строку для представления пар имя/значение в имени файла изображения.
string pairs = image_attribs(color,purple;size,large).jpg;
Мне нужно разобрать эту строку, чтобы получить пары имя/значение до и после точки с запятой. Я могу разделить на точку с запятой и вычесть длину в открывающую скобку, но я хотел бы, чтобы соответствующая функция была масштабируемой для нескольких пар.
Мне нужно придумать несколько подстрочных функций, которые могут возвращать эти пары. Затем я сделаю список KeyValuePairs:
List<KeyValuePair<string, string>> attributes = new List<KeyValuePair<string, string>>();
Текущий синтаксический анализ, который получает только первую пару:
string attribs = imagepath.Substring(imagepath.IndexOf("(") +1, imagepath.IndexOf(";" - imagepath.IndexOf("(");
У меня уже есть функция для разбора пар, разделенных запятыми, для создания и добавления новых KeyValuePairs.
var repspl = mydata.Split(';').Select( x => new { Key = x.Split(',')[0], Value = x.Split(',')[1] });
Вы можете использовать функцию split с массивом, как в этом примере:
using System;
public class SplitTest {
public static void Main() {
string words = "This is a list of words, with: a bit of punctuation" +
"\tand a tab character.";
string [] split = words.Split(new Char [] {' ', ',', '.', ':', '\t' });
foreach (string s in split) {
if (s.Trim() != "")
Console.WriteLine(s);
}
}
}
// The example displays the following output to the console:
// This
// is
// a
// list
// of
// words
// with
// a
// bit
// of
// punctuation
// and
// a
// tab
// character
Это от: http://msdn.microsoft.com/fr-fr/library/b873y76a(v=vs.110).aspx
Вы можете использовать комбинацию регулярного выражения и удобное использование возможностей захвата в модуле regex.net:
string pairs = "image_attribs(color,purple;size,large;attr,val).jpg";
//This would capture each key in a <attr> named group and each
//value in a <val> named group
var groups = Regex.Match(
pairs,
@"\((?:(?<attr>[^),]+?),(?<val>[^);]+?)(?:;|\)))*");
//Because each group capture is stored in .net you can access them and zip them into one list.
var yourList =
Enumerable.Zip
(
groups.Groups["attr"].Captures.Cast<Capture>().Select(c => c.Value),
groups.Groups["val"].Captures.Cast<Capture>().Select(c => c.Value),
(attr, val) => new KeyValuePair<string, string>(attr, val)
).ToList();
Вы могли бы сделать что-то веселое, например:
string pairs = "image_attribs(color,purple;size,large).jpg";
var attributes = Regex.Match(pairs, @"\((.*?)\)").Groups[1].Value.Split(';')
.Select(pair => pair.Split(','))
.Select(pair => new { Attribute = pair[0], Value = pair[1] });