Регулярное выражение - повторяющиеся группы

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

Ответ можно найти здесь: http: // www. cs.princeton.edu/~rs/AlgsDS07/17GeometricSearch.pdf

7
задан SilentGhost 7 November 2009 в 01:02
поделиться

4 ответа

Невозможно иметь повторяющиеся группы. Группа будет содержать последнее совпадение.

Вам нужно разбить это на две задачи. Сначала найдите каждый раздел:

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.
    }
}
12
ответ дан 6 December 2019 в 14:05
поделиться
((?<header>[^:]+:)(?<content>[^\r\n]+)?\r\n)+

или, если между элементами есть пустые строки:

(((?<header>[^:]+:)(?<content>[^\r\n]+)?\r\n)|\r\n)+
1
ответ дан 6 December 2019 в 14:05
поделиться

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

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.
1
ответ дан 6 December 2019 в 14:05
поделиться
1
ответ дан 6 December 2019 в 14:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: