2011-09-26 25 views
6

Sau một số nghiên cứu tôi đã tìm ra rằng không thể phân tích các cấu trúc đệ quy (như HTML hoặc XML) bằng cách sử dụng các biểu thức thông thường. Có thể liệt kê toàn diện các tình huống mã hóa hàng ngày mà tôi nên tránh sử dụng các biểu thức thông thường vì nó không thể thực hiện nhiệm vụ cụ thể đó bằng các biểu thức chính quy? Giả sử công cụ regex được đề cập không phải là PCRE.Khi nào tôi không nên sử dụng cụm từ thông dụng?

+1

Tôi nghĩ câu hỏi của bạn quá rộng. Nó không đủ xa "khi nào sử dụng một công cụ". Bạn có thể không thực sự mong đợi một câu trả lời dứt khoát cho tất cả các trường hợp có thể, bạn có thể? Khi nào sử dụng một công cụ: khi bạn hiểu nó, khi nó đơn giản hóa công việc của bạn, khi nó làm cho mã rõ ràng hơn thay vì phức tạp hơn ... Khi nào thì sử dụng regex? Khi bạn cần kết hợp các mẫu với chuỗi. Không thể làm tốt hơn thế nhiều. – Kobi

+0

Tôi đồng ý rằng 'khi nào sử dụng regex' là một câu hỏi rộng. Nhưng tôi nghĩ rằng nó rất hữu ích để được nhận thức của các kịch bản phổ biến, nơi bạn không thể sử dụng regex để thực hiện một nhiệm vụ cụ thể. Điều này sẽ tiết kiệm rất nhiều thời gian cho nhà phát triển. –

+0

Xem thêm câu hỏi này, với [ví dụ về "phân tích cú pháp bằng regex"] (http://stackoverflow.com/a/15589159/287948). –

Trả lời

26

Không sử dụng biểu thức thông thường khi:

  • ngôn ngữ mà bạn đang cố gắng để phân tích không phải là một regular language, hoặc
  • khi có phân tích cú pháp có sẵn đặc biệt làm cho dữ liệu bạn đang cố gắng để phân tích .

Phân tích cú pháp HTML và XML với cụm từ thông dụng thường là ý tưởng tồi bởi vì chúng không phải là ngôn ngữ thông thường và vì thư viện đã tồn tại có thể phân tích cú pháp đó cho bạn. Một ví dụ khác, nếu bạn cần kiểm tra xem một số nguyên nằm trong khoảng 0-255 hay không, sẽ dễ hiểu hơn nếu bạn sử dụng các hàm thư viện của ngôn ngữ để phân tích nó thành số nguyên và sau đó kiểm tra giá trị số thay vì cố gắng để viết cụm từ thông dụng phù hợp với phạm vi này.

+1

Câu trả lời EPIC. Toàn điểm. –

+2

Điểm đầy đủ là một! +1 –

+0

Tôi hiểu điều đó nhưng tôi chỉ muốn biết một số tình huống mã hóa hàng ngày mà tôi chỉ nên tránh xa các regex. Chẳng hạn như phân tích cú pháp HTML hoặc XML. –

2

Quy tắc chung của tôi là sử dụng cụm từ thông dụng khi không có giải pháp nào khác tồn tại. Nếu đã có một trình phân tích cú pháp (ví dụ, XML, HTML) hoặc bạn chỉ tìm kiếm các chuỗi thay vì các mẫu, thì không cần phải sử dụng các biểu thức chính quy.

Luôn tự hỏi mình "Tôi có thể giải quyết vấn đề này mà không sử dụng cụm từ thông dụng không?". Câu trả lời cho câu hỏi đó sẽ cho bạn biết liệu bạn có nên sử dụng cụm từ thông dụng hay không.

7

tôi sẽ ăn cắp của mình từ bài viết trên blog của tôi, When to use and when not to use regular expressions ...

trang web công cộng không nên cho phép người dùng nhập vào biểu thức thông thường để tìm kiếm. Cung cấp toàn bộ sức mạnh của regex cho công chúng cho công cụ tìm kiếm của trang web có thể có tác động tàn phá. Có một điều như một cuộc tấn công regular expression denial of service (ReDoS) mà nên tránh bằng mọi giá.

Không nên thực hiện phân tích cú pháp HTML/XML với cụm từ thông dụng. Trước hết, các cụm từ thông dụng được thiết kế để phân tích cú pháp một số regular language là cách đơn giản nhất trong số Chomsky hierarchy. Bây giờ, với sự ra đời của các định nghĩa nhóm cân bằng trong hương vị .NET của các biểu thức thông thường, bạn có thể mạo hiểm vào lãnh thổ hơi phức tạp hơn và thực hiện một vài điều với XML hoặc HTML trong các tình huống được kiểm soát. Tuy nhiên, không có nhiều điểm. Có các trình phân tích cú pháp có sẵn cho cả XML và HTML sẽ làm công việc dễ dàng hơn, hiệu quả hơn và đáng tin cậy hơn. Trong .NET, XML có thể được xử lý theo cách XmlDocument cũ hoặc thậm chí dễ dàng hơn với Linq to XML. Hoặc đối với HTML, có HTML Agility Pack.

Kết luận

Regular expressions có sử dụng của họ. Tôi vẫn cho rằng trong nhiều trường hợp, họ có thể tiết kiệm rất nhiều thời gian và công sức cho lập trình viên. Tất nhiên, với thời gian vô hạn & tài nguyên, người ta hầu như luôn có thể xây dựng một giải pháp thủ tục hiệu quả hơn một biểu thức chính quy tương đương.

Quyết định từ bỏ regex của bạn phải dựa trên 3 điều:

1.) Biểu thức chính quy có quá chậm trong kịch bản của bạn mà nó đã trở thành một nút cổ chai?

2.) Giải pháp thủ tục của bạn có thực sự nhanh hơn & dễ viết hơn cụm từ thông dụng không?

3.) Có trình phân tích cú pháp chuyên biệt nào sẽ thực hiện công việc tốt hơn không?

+0

Cảm ơn, Steve. Bài đăng trên blog của bạn rất rõ ràng! –

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