2008-08-27 27 views
9

Tôi đã thấy rất nhiều điểm chung trong khả năng regex của các công cụ/ngôn ngữ khác nhau được kích hoạt bằng regex (ví dụ: perl, sed, java, vim, v.v.), nhưng tôi cũng có nhiều điểm khác biệt.Tính năng phổ biến cho tất cả các hương vị regex?

tiêu chuẩn tập hợp con các khả năng regex mà tất cả các công cụ/ngôn ngữ hỗ trợ regex sẽ hỗ trợ không? Khả năng regex khác nhau như thế nào giữa các công cụ/ngôn ngữ?

Trả lời

1

Nếu bạn mất ngữ pháp grep regexp, không phải là egrep một, hoặc regexp ngữ pháp sed và sử dụng mà bạn nên sử dụng một tập hợp con an toàn trên nhiều nền tảng và công cụ.

Về điều duy nhất có thể cắn bạn là khi bạn chuyển đổi giữa việc triển khai regexp bằng cách sử dụng Tự động hóa hữu hạn (FSA) và những người sử dụng backtracking, ví dụ: triển khai định lượng sẽ khác nhau từ grep đến Perl.

Triển khai dựa trên FSA sẽ tìm thấy kết quả phù hợp dài nhất bắt đầu từ vị trí có thể đầu tiên. Backtracking những người sẽ tìm thấy trận đấu đầu tiên trái thiên vị, bắt đầu từ vị trí đầu tiên có thể. Nghĩa là, nó sẽ thử từng chi nhánh theo thứ tự trong mẫu cho đến khi tìm thấy một kết quả phù hợp.

Xem xét chuỗi "xyxyxyzz" và mẫu "(xy)*(xyz)?". Các công cụ dựa trên FSA sẽ khớp với chuỗi con dài nhất có thể, "xyxyxyz". Các công cụ dựa trên theo dõi lại sẽ khớp với chuỗi con đầu tiên được phân loại bên trái, "xyxyxy".

+0

"tự động quyết định không hữu hạn". Máy tính của tôi chỉ có bộ nhớ hữu hạn; làm thế nào nó giữ một $ THING vô hạn? Tôi nghĩ bạn có thể có nghĩa là s/hữu hạn/xác định/g. –

1

Hầu hết các công cụ biểu thức chính quy/ngôn ngữ hỗ trợ các basic capabilities:

  1. Character Classes/Sets và Phủ định của họ - []
  2. neo -^$
  3. luân phiên - |
  4. Quantifiers -? + * {N, m}
  5. metacharacters - \ w, \ s, \ d ...
  6. backreferences - \ 1, \ 2, ...
  7. Dot -.
  8. bổ đơn giản như/g và/i cho toàn cầu và bỏ qua trường hợp
  9. Thoát Nhân vật

More công cụ tiên tiến/ngôn ngữ hỗ trợ:

  1. Lookaheads và behinds
  2. lớp nhân vật POSIX
  3. Ranh giới từ
  4. Công tắc nội tuyến như cho phép inse case nsitivity cho chỉ một phần nhỏ của regex
  5. Modifiers như/x để cho phép thêm định dạng và ý kiến,/m cho multiline
  6. Named chụp
  7. Unicode
+2

Một số triển khai đơn giản (ví dụ: trong Scintilla/SciTE) thậm chí không hỗ trợ thay đổi hoặc một số định lượng (? Và {}). – PhiLho

0

Không có động cơ tiêu chuẩn. Tuy nhiên, định dạng Biểu thức chính quy mở rộng POSIX là một tập con hợp lệ của hầu hết các công cụ và có lẽ gần như bạn sẽ nhận được một tập hợp con được chuẩn hóa.

0

Xem cú pháp biểu thức chính quy của emacs: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps.

Tôi nhớ lại đọc cú pháp của emacs được đặt bằng đá (vì lý do tương thích ngược), vì vậy nếu bạn muốn tương thích với mọi thứ, hãy làm mọi thứ tương thích với điều này. Một số công cụ có thể hỗ trợ nó, những công cụ khác có thể không.

Trong khi bạn có một mục tiêu xứng đáng, tôi nghĩ rằng nó sẽ cực kỳ khó tiếp cận, và tôi cũng đã tìm thấy sự hối tiếc của các emacs để làm việc cùng. Có lẽ 99% của mọi thứ là đủ tốt nếu nó làm cho bạn hạnh phúc hơn và hiệu quả hơn?

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