Regex Grouping не возвращает значений - PullRequest
2 голосов
/ 20 октября 2019

Я пытаюсь получить некоторые именованные группы (X, Y, Z, W, P, R) из строки, и у меня возникают проблемы с получением вывода.

Это частьстрока, содержащая информацию, которую я пытаюсь извлечь:

[1,1] = Group: 1   Config:
X:  -196.999   Y:   1009.999   Z:  210.342
W:  90   P:   0   R:  90

Я пытался получить значения, используя следующее

@"(?<X>(?<=X:\s*)([+-]?\d*(\.\d+)?))
  (?<Y>(?<=Y:\s*)([+-]?\d*(\.\d+)?))
  (?<Z>(?<=Z:\s*)([+-]?\d*(\.\d+)?))
  (?<W>(?<=W:\s*)([+-]?\d*(\.\d+)?))
  (?<P>(?<=P:\s*)([+-]?\d*(\.\d+)?))
  (?<R>(?<=R:\s*)([+-]?\d*(\.\d+)?))"

, но я не получил никаких значений.

Только когда я использую @"(?<X>(?<=X:\s*)([+-]?\d*(\.\d+)?)(?=\s*Y:))", я получаю правильное значение для X Group.

Однако это

@"(?<X>(?<=X:\s*)([+-]?\d*(\.\d+)?)(?=\s*Y:))
  (?<Y>(?<=Y:\s*)([+-]?\d*(\.\d+)?)(?=\s*Z:))"

Также не дает мне никаких значений.

В конечном итоге совпадение Config:\s* также вступит в игру, и когда я попробую это

@"(?<=Config:\s*)(?<X>(?<=X:\s*)([+-]?\d*(\.\d+)?)(?=\s*Y:))"

Я не получаю значение, но это делает

@"(?<=:\s*)(?<X>(?<=X:\s*)([+-]?\d*(\.\d+)?)(?=\s*Y:))"

Итак, А) Я не понимаю, зачем мне смотреть в будущее (?=\s*Y:), чтобы получить значение

B) Почему происходит сбой, если я добавляю другую группу?

C) Почему я не сопоставляю Config?

Может кто-нибудь объяснить мне, что я здесь делаю неправильно?

1 Ответ

3 голосов
/ 20 октября 2019

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

string input = "[1,1] = Group: 1   Config:\nX:  -196.999   Y:   1009.999  \nZ:  210.342\nW:  90   P:   0   R:  90";
var re = new Regex(@"\b([A-Z]+):\s*([+-]?\d+(?:\.\d+)?)\b");
MatchCollection matches = re.Matches(input);
for (int mnum = 0; mnum < matches.Count; mnum++)
{
    Match match = matches[mnum];
    Console.WriteLine("{0}: {1}", match.Groups[1], match.Groups[2]);
}

Это печатает:

X: -196.999
Y: 1009.999
Z: 210.342
W: 90
P: 0
R: 90

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

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