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

1

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

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.

Теги:
string
substring
keyvaluepair

4 ответа

1
Лучший ответ
var repspl = mydata.Split(';').Select( x =>  new { Key = x.Split(',')[0], Value = x.Split(',')[1] });
  • 0
    Все решения были превосходны, но в конечном итоге я выбрал Кевина Кука, потому что это была единственная линия, и эта вещь уже раздута. Большинство других функций в классе используют списки, и это генерирует список очень лаконично. Спасибо всем за ответ. Спасибо, Кевин.
0

Вы можете использовать функцию 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

0

Вы можете использовать комбинацию регулярного выражения и удобное использование возможностей захвата в модуле 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();
0

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

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] });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню