Sto usando la seguente espressione regolareRegex con il gruppo non-cattura in C#
JOINTS.*\s*(?:(\d*\s*\S*\s*\S*\s*\S*)\r\n\s*)*
sui seguenti tipi di dati:
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
L'idea è quella di estrarre due gruppi, ognuno contenente una linea (a partire dal numero comune, 1, 2, ecc) il codice C# è la seguente:
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);
}
Tuttavia, questo non funziona: invece di restituendo due gruppi catturati (il gruppo interno), restituisce un gruppo: l'intero blocco, incluse le intestazioni delle colonne. Perché succede? C# tratta in modo diverso i gruppi non catturati?
Infine, le RegEx sono il modo migliore per farlo? (Mi sento davvero come se avessi due problemi ora.)
Sai, ho effettivamente controllato MSDN per scoprire come funziona la proprietà 'Capture' (non l'ho mai usata io stesso), e non ho notato che si riferisce al gruppo 0 (che è ovviamente la causa principale di costernazione per il PO). +1! – Cameron