Получение нескольких подстрок из одной строки С#

Я использую строку для представления пар имя/значение в имени файла изображения.

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.


person natep    schedule 23.05.2014    source источник
comment
опубликуйте свой код функции, который вы используете для анализа вашей строки.   -  person Selman Genç    schedule 23.05.2014
comment
Я пробовал несколько разных функций без везения. Самый актуальный как раз получает первую пару.   -  person natep    schedule 23.05.2014


Ответы (4)


Вы можете сделать что-нибудь веселое, например:

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] });
person Dave Bish    schedule 23.05.2014

Вы можете использовать функцию разделения с массивом, как в этом примере:

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%28v=vs.110%29.aspx

person Alexein1    schedule 23.05.2014

Вы можете использовать комбинацию регулярного выражения и классного использования возможностей захвата в механизме регулярных выражений .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's 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();
person Farhad Alizadeh Noori    schedule 23.05.2014

person    schedule
comment
Все решения были превосходны, но я в конечном итоге выбрал Кевина Кука, потому что это была одна строка, и эта штука уже раздулась. Большинство других функций в классе используют списки, и это очень лаконично сгенерировало список. Спасибо за ответ, всем. Спасибо, Кевин. - person natep; 23.05.2014