mi stosując poniższe wyrażenieRegex z nie przechwytywania grupę C#
JOINTS.*\s*(?:(\d*\s*\S*\s*\S*\s*\S*)\r\n\s*)*
w poniższej typ danych
JOINTS DISPL.-X DISPL.-Y ROTATION
1 0.000000E+00 0.975415E+01 0.616921E+01
2 0.000000E+00 0.000000E+00 0.000000E+00
Chodzi o to, aby wyodrębnić na dwie grupy, z których każda zawierała linię (począwszy od numeru złącza, 1, 2 itd.) Kod C# wygląda następująco:
string jointPattern = @"JOINTS.*\s*(?:(\d*\s*\S*\s*\S*\s*\S*)\r\n\s*)*";
MatchCollection mc = Regex.Matches(outFileSection, jointPattern);
foreach (Capture c in mc[0].Captures)
{
JointOutput j = new JointOutput();
string[] vals = c.Value.Split();
j.Joint = int.Parse(vals[0]) - 1;
j.XDisplacement = float.Parse(vals[1]);
j.YDisplacement = float.Parse(vals[2]);
j.Rotation = float.Parse(vals[3]);
joints.Add(j);
}
To jednak nie działa: raczej niż zwracając dwie przechwycone grupy (grupa wewnętrzna), zwraca jedną grupę: cały blok, łącznie z nagłówkami kolumn. Dlaczego to się dzieje? Czy C# radzi sobie inaczej z niezapisanymi grupami?
Są wreszcie najlepsze sposoby na zrobienie tego? (Naprawdę czuję, że mam teraz dwa problemy.)
Wiesz, rzeczywiście sprawdziłem MSDN, aby dowiedzieć się, jak działa własność 'Captures' (nigdy sam jej nie używałem) i nie zauważyłem, że odnosi się ona do grupy 0 (która jest oczywiście główną przyczyną konsternacji dla OP). +1! – Cameron