Извлечение переменного числа пар токенов из строки в пару массивов

2

Вот требование.

У меня есть строка с несколькими записями определенного формата. Пример ниже

string SourceString = "<parameter1(value1)><parameter2(value2)><parameter3(value3)>";

Я хочу получить вывод как ниже

string[] parameters = {"parameter1","parameter2","parameter3"};   
string[] values = {"value1","value2","value3"};

Вышеприведенная строка - всего лишь пример с тремя парами значений параметров. Строка может содержать 40, 52, 75 - любое количество записей (менее 100 в одной строке). Например, у меня есть несколько строк в массиве. Я хочу сделать эту операцию для всех строк в массиве.

Может ли кто-нибудь посоветовать, как это сделать? Я новичок в С#. Использует ли регулярное выражение лучшее решение или есть ли какой-либо другой метод? Любая помощь очень ценится.

  • 0
    Ваш пример sourceString потерян в форматировании?
  • 0
    Почему param3 в другом формате?
Показать ещё 6 комментариев
Теги:
parsing

2 ответа

1
Лучший ответ

Если вам не нравится RegEx, вы можете сделать что-то вроде этого:

  class Program
  {

    static void Main()
    {

        string input = "<parameter1(value1)>< parameter2(value2)>";
        string[] Items = input.Replace("<", "").Split('>');

        List<string> parameters = new List<string>();
        List<string> values = new List<string>();

        foreach (var item in Items)
        {
            if (item != "")
            {
                KeyValuePair<string, string> kvp = GetInnerItem(item);
                parameters.Add(kvp.Key);
                values.Add(kvp.Value);
            }
        }

        // if you really wanted your results in arrays
        //
        string[] parametersArray = parameters.ToArray();
        string[] valuesArray = values.ToArray();

    }


    public static KeyValuePair<string, string> GetInnerItem(string item)
    {
        //expects parameter1(value1)
        string[] s = item.Replace(")", "").Split('(');
        return new KeyValuePair<string, string>(s[0].Trim(), s[1].Trim());
    }
}

Это может быть немного быстрее, чем метод RegEx, но, конечно, не такой гибкий.

  • 0
    Большое спасибо DD59. Получил вывод именно так, как нужно из вашего поста. Еще раз спасибо!!!!
  • 0
    Никаких проблем, рад, что смог помочь :)
Показать ещё 1 комментарий
1

Вы можете использовать класс RegEx в сочетании с выражением для синтаксического анализа строки и создания этих массивов путем циклического перехода через MatchCollections.

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx

Это делает:

string[] parameters = null;
string[] values = null;
// string SourceString = "<parameter1(value1)><parameter2(value2)><parameter3(value3)>";
string SourceString = @"<QUEUE(C2.BRH.ARB_INVPUSH01)><CHANNEL(C2.MONITORING_CHANNEL)><QMGR(C2.MASTER_NA‌​ME.TRACKER)>";
// string regExpression = @"<([^\(]+)[\(]([\w]+)";
string regExpression = @"<([^\(]+)[\(]([^\)]+)";
Regex r = new Regex(regExpression);

MatchCollection collection = r.Matches(SourceString);
parameters = new string[collection.Count];
values = new string[collection.Count];

for (int i = 0; i < collection.Count; i++)
{
    Match m = collection[i];
    parameters[i] = m.Groups[1].Value;
    values[i] = m.Groups[2].Value;
} 
  • 0
    Я работаю над регулярным выражением, скоро буду.
  • 0
    привет mservidio, я пытался использовать регулярные выражения, но это работало только для одного набора параметра / значения. У меня есть несколько записей в одной строке. поэтому хотите получить параметры одного массива и значения другого. массивы параметров и значений будут иметь одинаковую длину.
Показать ещё 7 комментариев

Ещё вопросы

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