2011-10-21 42 views
6

Tôi đã sử dụng Cụm từ thông dụng trong một vài năm và cảm thấy thoải mái với họ, nhưng tôi đã tự hỏi liệu có bất kỳ hạn chế nào khi sử dụng chúng hay không. Tôi biết về những hạn chế liên quan đến đệ quy (được thảo luận ở đây http://blogs.msdn.com/b/jaredpar/archive/2008/10/15/regular-expression-limitations.aspx). Có bất kỳ hạn chế nào liên quan đến bộ nhớ không? Tôi giả sử bạn có thể nắm bắt một chuỗi lớn như bạn có thể phù hợp với bộ nhớ (hoặc VM sẽ cho phép bạn).Hạn chế của Biểu thức chính quy?

Có bất kỳ hạn chế nào khác với regex mà tôi nên biết không?

Cảm ơn trước,

Chris

+1

Bạn thực sự cần chỉ định công cụ regex bạn đang sử dụng, vì mỗi công cụ có giới hạn khác nhau. Một số đã đi xa như vậy để cho phép một số regexes giống ngữ pháp. Nhìn qua tchrist's (Tom Christiansen) câu trả lời ở đây trên SO bạn có thể có được một ý tưởng về sức mạnh một số động cơ regex đã đạt được. – ninjalj

Trả lời

5

Hạn chế

  1. Không thể giải quyết tất cả mọi thứ. (bất kỳ ai trên SO sẽ nói điều gì xảy ra khi bạn cố gắng phân tích HTML bằng regex)
  2. Không được sử dụng cho mọi thứ - vấn đề về khả năng đọc và hiệu suất. Sử dụng khi thích hợp. Không phải cho nhiệm vụ đơn giản, giống như các chuỗi của chuỗi, và cũng không cho nhiệm vụ phức tạp.

Bottomline, nó là một công cụ. Sử dụng nó giống như bất kỳ công cụ nào khác. Đừng sử dụng nó. Đừng để nó là công cụ duy nhất trong bộ công cụ của bạn.

8

Các regex cực kỳ có thể khá chậm và thiếu bộ nhớ. Tôi biết, bởi vì tôi đã tạo ra một cái. Nó có thể tokenize những gì không nên được tokenized bởi một regex. :-) nếu bạn muốn có một liên kết ... Bây giờ ... Tôi chưa bao giờ điểm chuẩn "nhỏ" regexes vì ​​vậy tôi không biết tốc độ của họ. Họ chắc chắn nhỏ gọn để viết.

Ah tôi đã quên, regexes là The Evil. Vấn đề chính của họ là chúng giống như búa và khi bạn có chúng, bạn cố gắng làm cho mọi vấn đề giống như móng tay. Vì vậy, vấn đề chính của họ là trong người dùng (lập trình viên).

Giới hạn "lớn" đầu tiên: Javascript chỉ triển khai một tập hợp con của chúng, không hỗ trợ Unicode. Thông thường, ngôn ngữ bạn sử dụng phía máy chủ có triển khai hoàn chỉnh hơn, do đó bạn bị giới hạn bởi js. Ngay cả việc triển khai khá hoàn chỉnh như .NET có giới hạn lớn: không hỗ trợ cho các cặp thay thế và không hỗ trợ cho các ký tự "được tạo" (các ký tự sử dụng dấu kết hợp). Nhưng, như thường lệ, vấn đề nằm trong lập trình viên. Làm thế nào nhiều lập trình viên biết Unicode biết phức tạp của Unicode, của các bộ chữ số khác nhau, của dấu phụ?

Giới hạn "lớn" thứ hai: bảo trì. Chúng phức tạp và không thể đọc được khi chúng được viết. Nhưng vài tháng sau? Họ trở nên tồi tệ hơn! Và nếu bạn phải đào tạo một lập trình mới, bây giờ anh ta phải học thêm một ngôn ngữ nữa: regex.

Giới hạn "lớn" thứ ba: chúng ẩn quá nhiều. Bạn thấy \d\s\d. Nó có nghĩa là gì? một chữ số một không gian và một chữ số? Chắc chắn rồi. Nhưng cả hai \d\s trong .NET Regexes "ẩn" một microworld. \d "đối sánh" bất kỳ chữ số không phải châu Âu nào (và có nhiều chữ cái trong Unicode). \s "phù hợp" rất nhiều không gian bí truyền mà tôi thậm chí không biết tên ... Tôi thậm chí không muốn nghĩ về nó. Chúng giống như tảng băng trôi. Chỉ 1/8 là ra khỏi nước, trong khi 7/8 bị ẩn. Nhưng đó là 7/8 có thể sẽ giết bạn.

+0

Lỗi regex như thế nào nếu JavaScript chỉ hỗ trợ "tập hợp con"? Và khả năng đọc không phải là một vấn đề hoặc với regexes tiết (mà, một lần nữa, JavaScript không hỗ trợ). Chắc chắn, bạn có thể viết các biểu thức khổng lồ, hiệu suất kém nếu bạn không biết mình đang làm gì (hoặc lạm dụng công cụ), cũng giống như bạn có thể viết các chương trình xấu bằng bất kỳ ngôn ngữ nào. Và -1 cho phân loại "ác" không đủ tiêu chuẩn mà không tạo ra một ounce ý nghĩa. –

+0

@TimPietzcker Đưa ra lỗi cho một đối tượng luôn là ngu xuẩn. Lỗi là trong con người ngu ngốc đã tạo ra/chiếu nó. Regexes không có lỗi. Chúng là lỗi ** y **. Và chúng là lỗi ** y ** không chỉ vì chúng là lỗi ** y ** mà bởi vì 1) chúng là con của một kỷ nguyên khác, một kỷ nguyên đơn giản hơn mà không có unicode hoặc quốc tế hóa và 2) mọi lập trình viên "cải thiện" chúng trong một cách khác. Trong cùng một cách họ không * ác *, giống như một khẩu súng không phải là * ác *, nhưng giống như súng, họ làm cho những người làm những điều đáng kinh ngạc. – xanatos

+0

@TimPietzcker Bây giờ, thực tế là có rất nhiều triển khai khác nhau của Regexes ... Điều này theo một cách là một vấn đề. Trong cùng một cách mà khi có nhiều unixes (không tương thích với nhau) điều này "phân mảnh" là một vấn đề. Nếu tôi phải viết một Regex trong ASP.Net, tôi biết tôi chỉ có thể sử dụng tập con có sẵn trên JS trong tôi muốn sử dụng nó phía khách hàng và phía máy chủ. Oh yeah, tôi có một chiếc Ferrari, nhưng tôi phải đi trên những con đường đất ... woah! – xanatos

3

Regex chỉ có thể phân tích cú pháp thông thường bất kỳ nội dung nào không có ngữ cảnh và bạn cần một ngăn xếp (tức là trình phân tích cú pháp thực).

Đó là chỉ giới hạn thực sự của chúng, hiệu suất phụ thuộc vào việc triển khai cụ thể, nhưng thường chậm ngay cả được biên dịch trước so với máy trạng thái.

+5

-1: hầu hết các công cụ regex (với ngoại lệ rõ ràng của re2, mà tôi đã không xem xét cẩn thận) đã đi xa hơn biểu thức thông thường tinh khiết. – ninjalj

+0

Vì vậy, bạn là một trong những "purists" mà không nhận ra stack regexes có thể? – xanatos

+0

@ninjalj Tôi không biết các cụm từ thông dụng 'không thường xuyên', bạn có thể chỉ cho tôi một ví dụ hoặc bài viết không? Cảm ơn. –

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