2012-01-27 21 views
5

là có cách nào để có được tất cả các kết quả có thể có của một mẫu biểu thức chính quy không ?. tất cả mọi thứ tôi đã thấy đề cập đến một mô hình được đánh giá dựa trên một chuỗi. nhưng những gì tôi cần là phải có một mô hình như thế này:có cách nào để có được tất cả các kết quả có thể có của một mẫu biểu thức chính quy không?

^EM1650S(B{1,2}|L{1,2})?$ 

tạo ra tất cả các trận đấu càng tốt:

EM1650S 
EM1650SB 
EM1650SBB 
EM1650SL 
EM1650SLL 
+0

Bạn không thấy điều này thường xuyên vì phần lớn các mẫu regex có xu hướng có vô số các kết quả có thể xảy ra. – Amber

+2

Không vô hạn. Chỉ là humongous. – Alfabravo

+0

Tôi ước điều đó có thể xảy ra. – ShankarSangoli

Trả lời

1

Trong trường hợp đặc biệt này, vâng. Regex tạo ra một số hữu hạn của chuỗi hợp lệ, vì vậy chúng có thể được đếm lên.

Bạn sẽ chỉ phải phân tích cú pháp regex. Một số phần trong số đó (EM1650S) là bắt buộc, vì vậy hãy nghĩ đến phần còn lại. Phân tích bằng ký hiệu | (hoặc). Sau đó liệt kê các chuỗi cho cả hai mặt của nó. Sau đó, bạn có thể nhận được tất cả các kết hợp có thể có của chúng.

Một số regex (có chứa * hoặc + biểu tượng) có thể đại diện cho vô số chuỗi, vì vậy chúng không thể đếm được.

+0

Tôi nghĩ rằng OP đang tìm kiếm một số dấu hiệu của _how để có được result_, không _only_ nếu nó có thể được thực hiện ... – cdeszaq

+0

Vâng, tôi biết. :) – 0605002

+0

Đây là một chỉ dẫn về cách hoàn thành nó, nó không phải dễ dàng, tôi không mong đợi bất cứ ai dành thời gian của họ để viết mã cho OP –

2

Trong trường hợp chung, không. Trong trường hợp này, bạn hầu như không có dung lượng giải pháp.

Có một số section covering this in Higher Order Perl (PDF)Perl module. Tôi không bao giờ tái triển khai nó trong bất cứ điều gì khác, nhưng tôi đã có một vấn đề tương tự và giải pháp này là thích hợp cho nhu cầu tương tự hạn chế.

2

Có các công cụ có thể hiển thị tất cả các kết quả phù hợp có thể có của một regex.

Dưới đây là một văn bản trong Haskell: https://github.com/audreyt/regex-genex và đây là một mô-đun Perl: http://metacpan.org/pod/Regexp::Genex

Đáng tiếc là tôi không thể tìm thấy bất cứ điều gì cho JavaScript

+1

Thú vị. Regexp-Genex giới hạn '*' thành '{0,3}' và '+' thành '{1,4}', bề ngoài để làm cho nó đẹp hơn, nhưng điều đó có tác dụng phụ của việc loại bỏ không gian giải pháp vô hạn mà hầu hết các regexes có. –

+1

Cool, genex giả sử rằng '*' là '{0,3}' và '+' là '{1,4}' và do đó tạo ra số lượng hoán vị hữu hạn. Wow đây là bình luận thứ hai của tôi rằng tôi đến muộn và kết thúc là một bản sao bình luận của người khác. –

+0

Vâng, nó không hoàn hảo. Đây là một chuỗi thảo luận về Reddit về chủ đề này: http://www.reddit.com/r/programming/comments/hya57/from_a_regex_generate_all_possible_strings_it_can/ –

1

Từ một quan điểm lý thuyết tính toán, biểu thức thông thường tương đương với hữu hạn máy trạng thái. Đây là một phần của "lý thuyết automata". Bạn có thể tạo ra một máy trạng thái hữu hạn tương đương với một biểu thức chính quy và sau đó sử dụng các thuật toán truyền tải đồ thị để đi qua tất cả các đường dẫn của FSM. Trong trường hợp chung một số lượng vô hạn các chuỗi có thể phù hợp với một biểu thức chính quy, vì vậy chương trình của bạn có thể không bao giờ chấm dứt tùy thuộc vào biểu thức chính quy đầu vào.

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