2011-09-23 25 views
6

Ngoài ra: Ok, tôi biết tôi không nên chọn cách phân biệt HTML như thế này với một regex, nhưng nó đơn giản nhất cho những gì tôi cần.Có phải kết thúc chuỗi regex được tối ưu hóa trong .NET không?

Tôi có regex này:

Regex BodyEndTagRegex = new Regex("</body>(.*)$", RegexOptions.Compiled | 
    RegexOptions.IgnoreCase | RegexOptions.Multiline); 

Chú ý cách tôi đang tìm kiếm sự kết thúc của chuỗi với $.

Các biểu thức chính quy của .NET có được tối ưu hóa để không phải quét toàn bộ chuỗi không? Nếu không, làm thế nào tôi có thể tối ưu hóa nó để bắt đầu ở cuối?

+0

Có vẻ như một câu hỏi lạ - bất kỳ lý do gì để nghi ngờ rằng chúng không thể? – Cocowalla

+0

Vâng, tôi sẽ làm điều này trên một chuỗi rất dài và tôi chỉ muốn biết nếu có một cách tốt hơn để tối ưu hóa nó. –

+0

Vì vậy, thực sự điều này chỉ là sự trợ giúp của ngắn gọn hơn so với các cuộc gọi đến 'LastIndexOf' và' Substring'? – AakashM

Trả lời

9

Bạn có thể kiểm soát nó bản thân bằng cách xác định Right-to-Left Mode tùy chọn, nhưng động cơ regex không optimize nó cứ tự động cho đến khi bạn làm điều đó cho mình bằng cách xác định một tùy chọn:

Tôi tin Điểm mấu chốt là:

Theo mặc định, công cụ biểu thức chính quy tìm kiếm từ trái sang phải.

Bạn có thể đảo ngược hướng tìm kiếm bằng cách sử dụng tùy chọn RegexOptions.RightToLeft. Tìm kiếm sẽ tự động bắt đầu tại vị trí ký tự cuối cùng của chuỗi. Đối với các phương thức phù hợp với mẫu bao gồm tham số vị trí bắt đầu, chẳng hạn như Regex.Match (Chuỗi, Int32), vị trí bắt đầu là chỉ mục của vị trí ký tự ngoài cùng bên phải của việc tìm kiếm bắt đầu từ .

Chú ý:

Tùy chọn RegexOptions.RightToLeft thay đổi hướng tìm kiếm; nó không diễn giải mẫu biểu thức chính quy từ phải sang bên trái

+3

Tôi vừa làm một bài kiểm tra nhanh bằng cách sử dụng biểu thức chính quy của OP trên một chuỗi dài, sử dụng 10.000 lần lặp. 1,950ms không có RegexOptions.RightToLeft, chỉ cần 64ms với nó. – Cocowalla

+0

@Cocowalla: minh họa rất tốt! – sll

+1

... và sử dụng 'LastIndexOf' kết hợp với' Chuỗi con' là nhanh hơn - chỉ 15ms. Nhưng trừ khi bạn có một lý do chính đáng, tôi muốn gắn bó với regex để dễ đọc và bảo trì :) – Cocowalla

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