2009-01-08 35 views
5

Tôi cần thuật toán tìm kiếm chuỗi C# có thể khớp với nhiều lần xảy ra mẫu. Ví dụ, nếu mẫu là 'AA' và chuỗi là 'BAAABBB' Regex tạo kết quả trận đấu Index = 1, nhưng tôi cần kết quả Index = 1,2. Tôi có thể buộc Regex đưa ra kết quả như vậy không?Kết hợp nhiều chuỗi C#

+0

mẫu '(? = A)' cho kết quả tốt nhưng mở rộng rất nhiều thời gian calc. Tôi có một chuỗi với 20 ký tự và tốc độ calc là rất quan trọng. Có ai có giải pháp khác không? Cảm ơn. –

+0

"(? = A)" không thực hiện những gì bạn muốn; bạn đã thử "A (? = A)" như AnthonyWJones đã đề xuất chưa? –

Trả lời

0

Bất kỳ biểu thức chính quy có thể cung cấp một loạt các MatchCollection

+0

Sẽ rất tuyệt, nếu bạn có thể dán một số mã demo cho việc này. –

+0

Đây là lý do tôi thêm liên kết vào MSDN ... – Dror

13

Sử dụng một mô hình lookahead: -

"A (? = A)"

Điều này tìm thấy bất kỳ A được theo sau bởi một A khác mà không tiêu thụ A. sau đây Do đó AAA sẽ phù hợp với mô hình này hai lần.

4

Để tóm tắt tất cả các bình luận cũ hơn:

Dim rx As Regex = New Regex("(?=AA)") 
Dim mc As MatchCollection = rx.Matches("BAAABBB") 

này sẽ tạo ra những kết quả mà bạn đang yêu cầu.

EDIT:
Đây là phiên bản C# (làm việc với VB.NET hôm nay vì vậy tôi vô tình tiếp tục với VB.NET).

Regex rx = new Regex("(?=AA)"); 
MatchCollection mc = rx.Matches("BAAABBB"); 
0

Hãy thử điều này:

 System.Text.RegularExpressions.MatchCollection matchCol; 
     System.Text.RegularExpressions.Regex regX = new System.Text.RegularExpressions.Regex("(?=AA)"); 

     string index="",str="BAAABBB"; 
     matchCol = regX.Matches(str); 
     foreach (System.Text.RegularExpressions.Match mat in matchCol) 
      { 
       index = index + mat.Index + ","; 
      }      

Nội dung của chỉ số là những gì bạn đang tìm kiếm với dấu phẩy cuối cùng loại bỏ.

0

Bạn có thực sự tìm kiếm các bản chất chỉ dài hai ký tự không? Nếu vậy, tìm kiếm một chuỗi ký tự 20 triệu sẽ bị chậm bất kể bạn sử dụng regex nào (hoặc bất kỳ kỹ thuật phi regex nào, cho vấn đề đó). Nếu chuỗi tìm kiếm dài hơn, công cụ regex có thể sử dụng thuật toán tìm kiếm như Boyer-Moore hoặc Knuth-Morris-Pratt để tăng tốc độ tìm kiếm - thực tế càng lâu càng tốt.

Nhân tiện, loại tìm kiếm bạn đang nói đến được gọi là các kết quả trùng lặp; Tôi sẽ thêm nó vào các thẻ.

Các vấn đề liên quan