Если вы действительно хотите знать разницу, бросайте каждый указатель на (char *), а затем на (int), а затем вычитаете. Это должно дать вам ответ.
Этот код дает вам абсолютное значение:
printf("%d\n", abs((int)((char*)q) - (int)((char*)p)));
Не забудьте включить math.h.
Изменить: Как указано в комментарии, Мне нужен двойной бросок. Кастинг каждого указателя указателя на int, а затем вычитание дает тот же ответ, что и (ненужное) двойное литье выше.
printf("%d\n", abs((int)(q) - (int)(p)));
В конце концов, я получил ответ методом проб и ошибок.
\| Average \| .*\d+\% +\| *(\d*.\d\%) +\| +\d
будет математике столбец ниже ветви. Спасибо всем за помощь!
Одно решение, которое я вижу, состоит в том, чтобы иметь регулярное выражение, которое будет захватывать несколько строк, начиная с первого «Среднее» и заканчивая вторым. Что касается всей логики, содержащейся в регулярном выражении, то вам необходимо знать, как задать параметры поиска в вашем регулярном выражении, обычно это делается с помощью /sm
. В конце ваше регулярное выражение будет выглядеть так:
/^\| Average *\| \d*.\d+\%.*$.*^\| Average *\| (\d*.\d+\%).*$/sm
Захваченная группа содержит только второе вхождение Average
процента Line
.
Как насчет этого:
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+\%(?=.*)