Вот требование.
У меня есть строка с несколькими записями определенного формата. Пример ниже
string SourceString = "<parameter1(value1)><parameter2(value2)><parameter3(value3)>";
Я хочу получить вывод как ниже
string[] parameters = {"parameter1","parameter2","parameter3"};
string[] values = {"value1","value2","value3"};
Вышеприведенная строка - всего лишь пример с тремя парами значений параметров. Строка может содержать 40, 52, 75 - любое количество записей (менее 100 в одной строке). Например, у меня есть несколько строк в массиве. Я хочу сделать эту операцию для всех строк в массиве.
Может ли кто-нибудь посоветовать, как это сделать? Я новичок в С#. Использует ли регулярное выражение лучшее решение или есть ли какой-либо другой метод? Любая помощь очень ценится.
Если вам не нравится 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, но, конечно, не такой гибкий.
Вы можете использовать класс 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_NAME.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;
}