2016-05-18 4 views
3

Я хочу использовать регулярное выражение, чтобы иметь возможность разделить следующую строкуСплит слова с помощью Regex

string text = "User:George;Color:Blue;Time:100;Day:Saturday;"; 

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

User = George 
Color = Blue 
Time = 100 
Day = Saturday 

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

string text = "Color:Blue;Day:Saturday;User:George;Time:100;"; 
+1

кажется, как Split лучший вариант –

+2

'text.Trim ('; ') .Split ('; '). Выберите (t => t.Split (': ')). ToDictionary (t => t [0], t => t [1]) ' – Blorgbeard

+0

Какой порядок для результат вывода? –

ответ

2

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

var text = "User:George;Color:Blue;Time:100;Day:Saturday;"; 
var dct = Regex.Matches(text, @"([^:;]+):([^;]+)") 
    .Cast<Match>() 
    .ToDictionary(p => p.Groups[1].Value, p => p.Groups[2].Value); 
var user = dct["User"]; 
var color = dct["Color"]; 
var time = dct["Time"]; 
var day = dct["Day"]; 
Console.WriteLine(user); 
Console.WriteLine(color); 
Console.WriteLine(time); 
Console.WriteLine(day); 

См IDEONE demo и вот regex demo.

([^:;]+):([^;]+) захватывает в 1-й группе один или более других, чем : и ; символов, а затем соответствует двоеточие, а затем захватывает в группе 2 один или несколько символов, кроме ;. Если значения являются необязательными, вы можете заменить + на * (и, возможно, добавить ;? в конце за круглыми скобками).

Однако другое предложение в комментариях (расщепление) выглядит намного лучше, просто использовать эту dct инициализацию:

var dct = text.Trim(';').Split(';').Select(t=>t.Split(':')).ToDictionary(t=>t[0], t=>t[1]); 

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

+0

Я использовал то, что было в демонстрации IDEONE, это работало как шарм – George

+0

Да, как я писал, 'dct' может быть инициализирован расщеплением, см. Строку кода в конце ответа. –

1

Попробуйте следующий метод, он возвращает список KeyValuePair для strInput:

private List<KeyValuePair<string, string>> GetKeyValuePairs(string strInput) 
{ 
    char[] strkeyValSeparator = new char[1] { ':' }; 
    char[] strBlockSeparator = new char[1] { ';' }; 
    string[] list = strInput.Split(strBlockSeparator, StringSplitOptions.RemoveEmptyEntries); 

    var lstSplitted = new List<KeyValuePair<string, string>>(); 

    foreach (string s in list) 
    { 
     string[] keyValuePair = s.Split(strkeyValSeparator, 2); 

     lstSplitted.Add(new KeyValuePair<string, string>(keyValuePair[0], keyValuePair[1])); 
    } 

    // Sorting by Key 
    lstSplitted.Sort((pair1, pair2) => pair1.Key.CompareTo(pair2.Key)); 

    return lstSplitted; 
} 

Вызов метода:

string strInput = "User:George;Color:Blue;Time:100;Day:Saturday;"; 

var res = GetKeyValuePairs(strInput); 

// Print on screen 
foreach (var r in res) 
    Console.WriteLine(r.Key + " = " + r.Value);