Получить второе вхождение из второго ряда - PullRequest
0 голосов
/ 19 марта 2019

У меня есть следующие таблицы из результата команды dotnet test, и я пытаюсь получить второе вхождение (те, что ниже Ветвь ) строк, начинающихся с Среднее .

+---------+-----------+-----------+-----------+
|         | Line      | Branch    | Method    |
+---------+-----------+-----------+-----------+
| Total   | 100%      | 100%      | 100%      |
+---------+-----------+-----------+-----------+
| Average | 100%      | 100%      | 100%      | 
+---------+-----------+-----------+-----------+

+---------+-----------+-----------+-----------+
|         | Line      | Branch    | Method    |
+---------+-----------+-----------+-----------+
| Total   | 100%      | 100%      | 100%      |
+---------+-----------+-----------+-----------+
| Average | 100%      | 100%      | 100%      | 
+---------+-----------+-----------+-----------+

Мне удалось написать следующее регулярное выражение ^\| Average *\| (\d+.\d+\%).*$, но добавление {2} в любом месте выражения все еще не возвращает мне второе вхождение.Кроме того, я пытался использовать https://regex101.com/, но информация о совпадении, которую он показывает, выглядит следующим образом:

Regex101.com Match Information

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

Любая помощь?Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Что по этому поводу:

string table =
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "|         | Line      | Branch    | Method    |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "| Total   | 100%      | 100%      | 100%      |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "| Average | 100%      |  89%      | 100%      |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "|         | Line      | Branch    | Method    |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "| Total   | 100%      | 100%      | 100%      |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "| Average | 100%      | 99%       | 100%      |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+";

MatchCollection matches = Regex.Matches(table, @"(?<=\| Average *\| \d+\% +\| *)\d+\%(?=.*)");

foreach (Match m in matches)
{
    Console.WriteLine(m.Value);
}

Выходы:

89%
99%

Обновление:

Мне пришлось выяснить, что .NET (там, где я построил свой RegEx) поддерживает квантификаторы в выражениях обхода, в то время как в других реализациях RegEx такой поддержки нет.

Поэтому выражение RegEx моего решения не будет работать там.

Чтобы решить эту проблему, я удалил квантификаторы и заменил их объявлениями с фиксированными символами. Это работает для фиксированной таблицы, но не будет работать, если макет таблицы имеет динамическую ширину:

(?<=\| Average \| ..\d\%      \| )\d+\%(?=.*)
0 голосов
/ 20 марта 2019

В конце концов, я получил ответ методом проб и ошибок.

\| Average \| .*\d+\% +\| *(\d*.\d\%) +\| +\d

приведёт в соответствие столбец ниже Филиалы.Спасибо всем за помощь!

0 голосов
/ 19 марта 2019

Одно решение, которое я вижу, состоит в том, чтобы иметь регулярное выражение, которое будет захватывать несколько строк, начиная с первого «Среднее» и заканчивая вторым. Что касается всей логики, содержащейся в регулярном выражении, то вам необходимо знать, как задать параметры поиска в вашем регулярном выражении, обычно это делается с помощью /sm. В конце концов, ваше регулярное выражение будет выглядеть так:

/^\| Average *\| \d*.\d+\%.*$.*^\| Average *\| (\d*.\d+\%).*$/sm

Захваченная группа содержит только второе вхождение Average в процентах Line.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...