Как разделить строку на основе нескольких ключевых слов?

#c#

Вопрос:

У меня есть строка, в которой строковые значения разделены специальным символом’;’, и мне нужно разделить строку и сохранить каждое значение в отдельной строке. В моем ipStr ключевые слова, такие как имя сервера, имя базы данных, имена таблиц и имена столбцов, являются идентификаторами, и они не изменятся, могут измениться только значения.

например.

 string ipStr = "ServerName=DevTestServer;DBName=CustomerSummary;TableNames=CustomerDetailsamp;OrderDetails;ColumnNames=ID,CustName,OrderID;"
 

Теперь я хочу разделить значения имя_сервера, ИМЯ_бд, имен таблиц и имен столбцов отдельно и сохранить каждое значение в разных строках. Я попытался ниже, но после поиска имени сервера идентификация части имени базы данных выглядит сложной, а также не похоже на правильный способ кодирования.

 string ServerIdentifier = "ServerName=";
string separator = ";";
string serverName = ipStr.Substring(ipStr.IndexOf(ServerIdentifier), ipStr.IndexOf(delimiter));
 

Каков самый простой способ получения значений, подобных приведенным ниже, из ipStr?

 string ServerName="DevTestServer";
string DBName="CustomerSummary";
string TableNames="CustomerDetailsamp;OrderDetails";
string ColumnNames="ID,CustName,OrderID";
 

Комментарии:

1. Используйте indexOf и храните разделенную строку в каждой переменной.

2. выполните поиск ConnectionStringBuilder — может быть полезно здесь

Ответ №1:

SqlConnectionStringBuilder не будет работать, потому ServerName что etc не является допустимым маркером в строке подключения.

Тем не менее, низкотехнологичный подход заключается в использовании старого доброго Split ToDictionary

 var someWeirdStr = "ServerName=DevTestServer;DBName=CustomerSummary;TableNames=CustomerDetailsamp;OrderDetails;ColumnNames=ID,CustName,OrderID;";

var results = someWeirdStr
   .Split(';',StringSplitOptions.RemoveEmptyEntries)
   .Select(x => x.Split('='))
   .ToDictionary(x => x[0], x => x.ElementAtOrDefault(1));

Console.WriteLine(results["ServerName"]);
Console.WriteLine(results["DBName"]);
Console.WriteLine(results["TableNames"]);
Console.WriteLine(results["ColumnNames"]);
 

Выход

 DevTestServer
CustomerSummary
CustomerDetailsamp;OrderDetails
ID,CustName,OrderID
 

Комментарии:

1. Это произойдет после разделения точкой с запятой, в этот момент вам нужно удалить пустые строки.

2. @Общие — строковые разбиения. RemoveEmptyEntries показывает ошибку. Не удается преобразовать из StringSplitOptions. Удалите все элементы в char.

3. @Ask_SO попробуйте .Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries) , если вы используете более старую версию .net

Ответ №2:

вам нужно разделить строку точкой с запятой, а затем удалить все пустые строки, после чего вы можете снова разделить ее на равные и создать словарь результатов.

 string ipStr = "ServerName=DevTestServer;DBName=CustomerSummary;TableNames=CustomerDetailsamp;OrderDetails;ColumnNames=ID,CustName,OrderID;";
    
    var values = ipStr.Split(';')
        .Where(x => !string.IsNullOrEmpty(x))
        .Select(x => {
            var pair = x.Split('=');
            return KeyValuePair.Create<string, string>(pair[0], pair[1]);
        })
        .ToDictionary(pair => pair.Key, pair => pair.Value);
    foreach (var i in values) {
        Console.WriteLine($"{i.Key}: {i.Value}");
    }
 

Ответ №3:

Вот рабочая демонстрация:

 string ipStr = "ServerName=DevTestServer;DBName=CustomerSummary;TableNames=CustomerDetailsamp;OrderDetails;ColumnNames=ID,CustName,OrderID;";
            Dictionary<string, string> dict = Regex
                .Matches(ipStr, @"s*(?<key>[^;=] )s*=s*((?<value>[^'][^;]*)|'(?<value>[^']*)')")
                .Cast<Match>()
                .ToDictionary(m => m.Groups["key"].Value,m => m.Groups["value"].Value);
 

Результат:

введите описание изображения здесь