Это может быть немного сложным для собеседования, зависит от того, какую работу, Это алгоритм геометрических вычислений,
Ответ можно найти здесь: http: // www. cs.princeton.edu/~rs/AlgsDS07/17GeometricSearch.pdf
Невозможно иметь повторяющиеся группы. Группа будет содержать последнее совпадение.
Вам нужно разбить это на две задачи. Сначала найдите каждый раздел:
new Regex(@"(?>^[A-Z\s]+:\s*$)\s*(?:(?!^\S).)*", RegexOptions.Singleline | RegexOptions.Multiline);
А затем в каждом совпадении используйте другое регулярное выражение для сопоставления каждого поля / значения по группам:
new Regex(@"^\s+(?<name>[^:]*):\s*(?<value>.*)$", RegexOptions.Multiline);
Код для использования этого будет выглядеть примерно так:
Regex sectionRegex = new Regex(@"(?>^[A-Z\s]+:\s*$)\s*(?:(?!^\S).)*", RegexOptions.Singleline | RegexOptions.Multiline);
Regex nameValueRegex = new Regex(@"^\s+(?<name>[^:]*):\s*(?<value>.*)$", RegexOptions.Multiline);
MatchCollection sections = sectionRegex.Matches(logData);
foreach (Match section in sections)
{
MatchCollection nameValues = nameValueRegex.Matches(section.ToString());
foreach (Match nameValue in nameValues)
{
string name = nameValue.Groups["name"].Value;
string value = nameValue.Groups["value"].Value;
// OK, do something here.
}
}
((?<header>[^:]+:)(?<content>[^\r\n]+)?\r\n)+
или, если между элементами есть пустые строки:
(((?<header>[^:]+:)(?<content>[^\r\n]+)?\r\n)|\r\n)+
Вот как я бы это сделал. Это позволит вам легко получить значение определенной группы, но выражение будет немного сложнее. Я добавляю переводы строк, чтобы их было легче читать. Вот начало:
COMPUTER INFO:.*Computer Name:\s*(?<ComputerName>[\w\s]+).*Windows User Name:\s*(?<WindowUserName>[\w\s]+).*Time Since Last Reboot:\s*(?<TimeSinceLastReboot>[\w\s]+).* (?# This continues on through each of the lines... )
с Comiled, IgnoreCase, SingleLine и CultureInvariant
Тогда вы сможете сопоставить это с помощью групп ex:
string computerName = match.Group["ComputerName"].Value;
string windowUserName = match.Group["WindowUserName"].Value;
// etc.
Some links regarding repeating groups in regular expressions: