C # Как разделить (A: B = C) * с помощью регулярных выражений?

StackOverflow https://stackoverflow.com/questions/1042619

  •  22-07-2019
  •  | 
  •  

Вопрос

Это, предположительно, очень простой вопрос, но я просто не могу найти правильное решение. Есть строка в формате:

A:B=C;D:E=F;G:E=H;...

тогда как A, B и C являются буквенно-цифровыми (и могут быть как в нижнем, так и в верхнем регистре). A и B имеют длину 1+, C может быть пустым.

Я подумал, что мне придется использовать что-то вроде

((?<A>.+):(?<B>.+)=(?<C>.*);)*

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

Я был бы рад, если бы вы могли дать мне подсказку.

Это было полезно?

Решение

Вы можете использовать \ w для сопоставления буквенно-цифровых символов, а не . , что соответствует всему. Затем вы можете попытаться получить по одному совпадению за раз:

(?<A>\w+):(?<B>\w+)=(?<C>\w*);

Вот небольшой пример:

Regex regex = new Regex("(?<A>\\w+):(?<B>\\w+)=(?<C>\\w*);");
string test = "A:B=C;D:E=F;G:E=H";

// get all matches
MatchCollection mc = regex.Matches(test);

foreach (Match m in mc) { 
    Console.WriteLine("A = {0}", m.Groups["A"].Value);
    Console.WriteLine("B = {0}", m.Groups["B"].Value);
    Console.WriteLine("C = {0}", m.Groups["C"].Value);
}

note : есть несколько инструментов, которые позволяют вам экспериментировать с регулярными выражениями, а также предоставляют некоторую помощь; Мне лично нравится Expresso - попробуйте, это будет очень полезно для обучения.

Другие советы

Требуется ли регулярное выражение? Поскольку строка имеет очень структурированную, хорошо структурированную структуру, ее легко разобрать без регулярного выражения:

string input = "A:B=C;D:EF=G;E:H=;I:JK=L";
string[] elements = input.Split(new[] { ';' });
List<string[]> parts = new List<string[]>();
foreach (string element in elements)
{
    parts.Add(element.Split(new[] { ':', '=' }));
}
// result output
foreach (string[] list in parts)
{
    Console.WriteLine("{0}:{1}={2}", list[0], list[1], list[2]);
}

Результат будет:

A:B=C
D:EF=G
E:H=
I:JK=L
Regex r = new Regex("(?<A>\\w)+:(?<B>\\w)+=(?<C>\\w)*;");

\ w будет соответствовать буквенно-цифровым символам и подчеркиванию, что эквивалентно [a-zA-Z0-9 _].

Обратный слеш экранируется в строке, поэтому он становится \ \ w.

Регулярное выражение захватывает группы A, B и C и сопоставляет 0 или более элементов C или целых групп, разделенных точкой с запятой.

У вас будет несколько объектов Match:

MatchCollection m = r.Matches(sampleInput);
// m[0] will contain A:B=C;
// m[1] will contain D:E=F;
// m[2] will contain G:E=H;
// ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top