Tôi đang sử dụng Regex sauRegex với phi chụp nhóm trong C#
JOINTS.*\s*(?:(\d*\s*\S*\s*\S*\s*\S*)\r\n\s*)*
vào loại dữ liệu sau:
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
Ý tưởng là để trích xuất hai nhóm, mỗi dòng chứa một dòng (bắt đầu bằng Mã số, 1, 2, v.v.) Mã C# như sau:
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);
}
Tuy nhiên, điều này không hoạt động: thay vì trả về hai nhóm được chụp (nhóm bên trong), nó trả về một nhóm: toàn bộ khối, bao gồm các tiêu đề cột. Lý do tại sao điều này xảy ra? C# có giao dịch với các nhóm không bị bắt khác nhau không?
Cuối cùng, RegExes là cách tốt nhất để làm điều này? (Tôi thực sự cảm thấy như tôi có hai vấn đề bây giờ.)
Bạn biết đấy, tôi thực sự đã kiểm tra MSDN để tìm hiểu xem thuộc tính 'Captures' hoạt động như thế nào (tôi chưa bao giờ sử dụng nó), và tôi đã không chú ý rằng nó đề cập đến nhóm 0 (rõ ràng là nguyên nhân chính gây ra sự cố cho OP). +1! – Cameron