.NET cung cấp bộ sưu tập Capture trong triển khai RegularExpression của nó để bạn có thể nhận được tất cả các trường hợp của một nhóm lặp nhất định chứ không phải là phiên bản cuối cùng của nó. Điều đó thật tuyệt, nhưng tôi có một nhóm lặp lại với các nhóm con và tôi đang cố gắng truy cập các nhóm con khi chúng có liên quan trong nhóm và không thể tìm thấy cách nào. Bất kỳ đề xuất?Trong RegEx của .NET tôi có thể lấy một bộ sưu tập Nhóm từ một đối tượng Capture không?
tôi đã xem xét số câu hỏi khác, ví dụ:
- Select multiple elements in a regular expression
- Regex .NET attached named group
- How can I get the Regex Groups for a given Capture?
nhưng tôi đã không tìm thấy câu trả lời áp dụng một trong hai khẳng định ("Yep, đây là cách ") hoặc tiêu cực (" Không, không thể làm được. ").
Đối với một ví dụ contrived nói rằng tôi có một chuỗi đầu vào:
abc d x 1 2 x 3 x 5 6 e fgh
nơi "abc" và "FGH" đại diện cho văn bản mà tôi muốn bỏ qua trong tài liệu lớn hơn, "d" và "e" bao quanh khu vực quan tâm và trong khu vực quan tâm đó, "xn [n]" có thể lặp lại bất kỳ số lần nào. Đó là những cặp số trong các lĩnh vực "x" Tôi quan tâm đến
Vì vậy, tôi phân tích nó bằng mẫu biểu thức chính quy này:.
.*d (?<x>x ((?<fir>\d+))?((?<sec>\d+))?)*?e.*
mà sẽ tìm thấy chính xác một trận đấu trong tài liệu, nhưng nắm bắt nhóm "x" nhiều lần. Dưới đây là ba cặp tôi muốn trích xuất trong ví dụ này:
- 1, 2
- 5, 6
nhưng làm thế nào tôi có thể nhận được chúng? Tôi có thể làm như sau (trong C#):
using System;
using System.Text;
using System.Text.RegularExpressions;
string input = "abc d x 1 2 x 3 x 5 6 e fgh";
string pattern = @".*d (?<x>x ((?<fir>\d+))?((?<sec>\d+))?)*?e.*";
foreach (var x in Regex.Match(input, pattern).Groups["x"].Captures) {
MessageBox.Show(x.ToString());
}
và kể từ khi tôi đang tham khảo nhóm "x" Tôi có được những chuỗi:
- x 1 2
- x 3
- x 5 6
Nhưng điều đó không giúp tôi có được con số.Vì vậy, tôi có thể làm "linh sam" và "giây" độc lập thay vì chỉ "x":
using System;
using System.Text;
using System.Text.RegularExpressions;
string input = "abc d x 1 2 x 3 x 5 6 e fgh";
string pattern = @".*d (?<x>x ((?<fir>\d+))?((?<sec>\d+))?)*?e.*";
Match m = Regex.Match(input, pattern);
foreach (var f in m.Groups["fir"].Captures) {
MessageBox.Show(f.ToString());
}
foreach (var s in m.Groups["sec"].Captures) {
MessageBox.Show(s.ToString());
}
để có được:
nhưng sau đó tôi không có cách nào để biết rằng đó là cặp thứ hai thiếu "4", và không phải là một trong các cặp khác.
Vậy phải làm gì? Tôi biết tôi có thể dễ dàng phân tích cú pháp này trong C# hoặc thậm chí với thử nghiệm regex thứ hai trên nhóm "x", nhưng kể từ lần chạy RegEx đầu tiên đã thực hiện tất cả công việc và kết quả ĐƯỢC biết, có vẻ như phải có cách để điều khiển đối tượng Match để có được thứ tôi cần. Và hãy nhớ, đây là một ví dụ giả tạo, trường hợp thế giới thực có phần phức tạp hơn vì vậy chỉ cần ném thêm mã C# vào nó sẽ là một nỗi đau. Nhưng nếu các đối tượng .NET hiện tại không thể làm được, thì tôi chỉ cần biết điều đó và tôi sẽ tiếp tục theo cách của mình.
Suy nghĩ?
Xuất hiện không có khái niệm về phân cấp trong tên. Tôi sẽ chỉ làm một Regex thứ hai trên x làm nhận được linh sam. – Paparazzi