2014-05-09 26 views
5

Tôi đang thực hiện các bài tập về biểu thức chính quy và tôi thực sự không chắc chắn về cách thực hiện điều này.đơn giản hóa cụm từ thông dụng

Các biểu thức chính quy là:

((a*)(b*))*U(a*) 

Tôi thực sự xấu lúc này, nhưng tôi nghĩ rằng ((a*)(b*))* có thể được đơn giản hóa để (a U b)* Nhưng nếu điều này là đúng, so với trước U(a*) thực sự chỉ là một sự lặp lại, vì vậy Tôi hình toàn bộ biểu thức có thể được đơn giản hóa thành (a U b)*. Điều này có đúng không?

Chỉnh sửa: U là viết tắt của union

+2

Không 'U' đứng cho công đoàn? Tức là, với '(a U b) *' bạn có thực sự ngụ ý những gì sẽ được biểu diễn trong regex là '(a | b) *' hay '[ab] *'? Nguyên nhân nếu mô hình đó bạn có vẻ như chỉ bằng '(a | b) *' như bạn đã gợi ý. –

+1

Nếu 'U' được cho là có nghĩa là" công đoàn ", thì sẽ thích hợp khi sử dụng biểu tượng thích hợp (' ∪') - hoặc ít nhất là viết hoa trong văn bản. – Tomalak

+0

Đã chỉnh sửa văn bản ngay bây giờ :) – user2795095

Trả lời

3

Bạn nói đúng. (a*b*)* có thể khớp với bất kỳ chuỗi ký tự nào và của b, vì vậy có thể (a U b)*, do đó chúng tương đương nhau. (a U b)* cắt nhau a*a* vì vậy a* là một tập con của (a U b)*. Do đó, toàn bộ biểu thức có thể được đơn giản hóa thành (a U b)*.

+0

Bạn đã sai. '(a U b) *' sẽ khớp với chữ 'a U b' bằng 0 hoặc nhiều lần. Nó không còn là những gì regex gốc được dự định để phù hợp. – Deele

+0

tại sao bạn lại nói vậy? Liên minh và OR chính xác là giống nhau. và câu hỏi này là về các ngôn ngữ thông thường chính thức. – perreal

+0

Chúng không nằm trong ngữ cảnh của regex. '(a | b) *' cũng là biểu thức sai. OP không nói rằng anh ta đang hỏi về _format languages_ thường xuyên hoặc bất cứ thứ gì như thế. Anh ta thêm thẻ 'regex' và hỏi về regex.Vì vậy, câu hỏi nên được downvoted và bạn nên sử dụng các biểu tượng regex thích hợp, để trả lời câu hỏi regex. Mỗi ký tự được sử dụng trong số lượng biểu thức. – Deele

-2

((a*)(b*))*U(a*) thực sự có nghĩa là (sao chép từ here)

NODE      EXPLANATION 
-------------------------------------------------------------------------------- 
    (      group and capture to \1 (0 or more times 
          (matching the most amount possible)): 
-------------------------------------------------------------------------------- 
    (      group and capture to \2: 
-------------------------------------------------------------------------------- 
     a*      'a' (0 or more times (matching the 
           most amount possible)) 
-------------------------------------------------------------------------------- 
    )      end of \2 
-------------------------------------------------------------------------------- 
    (      group and capture to \3: 
-------------------------------------------------------------------------------- 
     b*      'b' (0 or more times (matching the 
           most amount possible)) 
-------------------------------------------------------------------------------- 
    )      end of \3 
-------------------------------------------------------------------------------- 
)*      end of \1 (NOTE: because you are using a 
          quantifier on this capture, only the LAST 
          repetition of the captured pattern will be 
          stored in \1) 
-------------------------------------------------------------------------------- 
    U      'U' 
-------------------------------------------------------------------------------- 
    (      group and capture to \4: 
-------------------------------------------------------------------------------- 
    a*      'a' (0 or more times (matching the most 
          amount possible)) 
-------------------------------------------------------------------------------- 
)      end of \4 

biểu hiện này hiện phù hợp với tất cả các trình tự: abUa bU U aabbUaa aaUaa aaU Uaa bbU ababUaa aabbaabbUaa (nhìn vào here)

Không có cách nào để đơn giản hóa này, mà không cần loại bỏ chụp nhóm và thứ tự các chữ cái còn lại.

CHỈNH SỬA: Nếu U trong câu lệnh regex của bạn là viết tắt của "union", thì biểu thức này không hợp lệ. Không có cách nào để kết hợp bất cứ điều gì trong regex. Chỉ có OR và bạn cần sử dụng | (đường ống) cho điều đó. Nếu bạn muốn kết hợp ((a*)(b*))*(a*) thì có thể nó sẽ là ((a*)(b*))*, nhưng vẫn khớp với bất kỳ thứ gì như abaab.

Tuy nhiên, việc chụp các nhóm trong câu lệnh regex của bạn là vô ích, vì vậy, chẳng hạn như [ab]* đủ để khớp với bất kỳ số nào của ab.

+0

Không có ảnh chụp, chúng là nhóm không chụp trong OP. – perreal

+0

Vì 'U' là viết tắt của nghiệp đoàn trong trường hợp này (xem bình luận cho câu hỏi của OP) lời giải thích của bạn không may là đúng (nó giả định' U' là ký tự '" U "'). Nó rất mơ hồ và không phải lỗi của bạn. –

+0

@perreal Không chụp nhóm là '(? :)' OP sử dụng '()' – Deele

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