Có thể viết lại các biểu thức có chứa định lượng không liên quan (miễn cưỡng) để không sử dụng chúng không?


8

Hãy xem xét một ngôn ngữ regex với bộ định lượng tham lam , bộ định lượng không tham lam, ra lệnh xen kẽ, và các lớp nhân vật. (Đây thực chất là một ngôn ngữ con của PCRE mà không có phản hồi, xác nhận xung quanh hoặc một số bit fancier khác.) ??

Một trận đấu cho một regex trên một chuỗi là một khoảng thời gian nửa mở trên mà được chấp nhận bởi .R s = s 0 ... s n N s một 0 ... một 1 - 1 R[a0,a1)Rs=s0snNsa0sa11R

Chúng tôi đưa ra một định nghĩa đệ quy về những gì làm cho một kết hợp tốt hơn so với khác. Trận đấu cho regex trên chuỗi tốt hơn so với trận đấu khác nếu hoặc, nếu và:Ra=[a0,a1)Ra 0 < b 0 a 0 = b 0b=[b0,b1)a0<b0a0=b0

  • Nếu là một lớp nhân vật: Các lớp nhân vật có các trận đấu duy nhất, vì vậy tất cả các trận đấu ở cùng một vị trí cho đều bằng nhau. Do đó trường hợp này là không thể.RRR

  • Nếu :R=ST

    • Phần đầu của là phần khớp với tốt hơn phần đầu của , hoặcS baSb
    • Các phần đầu của và là các kết quả khớp tốt cho và phần cuối của là phần khớp với tốt hơn phần đuôi của .b S a T babSaTb
  • Nếu :R=S|T

    • a là khớp với và thì không, hoặcbSb
    • a và tương xứng với và là kết hợp tốt hơn cho so với , hoặcS a S bbSaSb
    • a và không khớp với nhưng là khớp với và phù hợp hơn với T so với b .S T a T bbSTaTb

Tất cả các hình thức cú pháp khác giảm xuống ba mục đích trên cho mục đích ưu tiên khớp:

  • R=S : RS0|S1|
  • R=S?: R|S1|S0

Các mẫu vô hạn này chỉ được sử dụng cho mục đích ưu tiên đối sánh --- chúng không phải là một phần của ngôn ngữ đối sánh đang được xem xét.

Mối quan hệ "tốt hơn" là một trật tự tuyến tính yếu trên tất cả các kết quả khớp có thể có cho một mẫu nhất định.

Gọi hai regexes trận đấu tương đương nếu, mỗi chuỗi đầu vào hữu hạn, tập các cặp rời nhau phù hợp nhất cho bằng tập các cặp rời nhau phù hợp nhất cho .S TS,T ST

Q: Có phải là trường hợp cho mọi regex có chứa bộ định lượng không tham giaCó một biểu thức chính quy tương đương không chứa định lượng không tham gia? ? TS?T

Chỉnh sửa: Đây là một bản viết lại hoàn chỉnh của câu hỏi để làm rõ những gì đang được hỏi.


1
Tôi đã cố gắng sửa LaTeX trong câu hỏi, nhưng vui lòng kiểm tra xem đó có phải là ý bạn không. ( \ttkhông ngăn LaTeX diễn giải các ký tự đặc biệt và các chuỗi điều khiển!)
Tsuyoshi Ito

2
Bạn phải cẩn thận với những gì bạn muốn nói bởi sức mạnh biểu cảm của một biểu thức thông thường. Nếu bạn chỉ xem xét ngôn ngữ mà biểu thức chính quy nhận ra, thì thật là tầm thường khi các bộ lượng tử miễn cưỡng không thêm bất kỳ sức mạnh nào vì chúng không thay đổi ngôn ngữ mà biểu thức chính quy nhận ra ở vị trí đầu tiên. Nhưng tôi nghĩ rằng bạn đang nghĩ về các thuộc tính tốt hơn của các biểu thức chính quy như các chuỗi con nào được ghi lại và v.v.
Tsuyoshi Ito

1
Không, L ( a+?) vẫn là {a ^ n: n≥1}. Nếu bạn thực hiện một unanchored trận đấu regex (như 'aaaa' =~ /a+?/trong Perl), bạn sẽ không nhận được aaaakết quả là, nhưng đó chỉ là vì các chi nhánh đang cố gắng theo một thứ tự khác nhau từ a+. Nếu bạn làm điều đó một cách thích hợp với các neo (chẳng hạn như 'aaaa' =~ /^a+?\z/trong Perl), bạn sẽ nhận được aaaakết quả.
Tsuyoshi Ito

1
(1) Tôi rất vui khi thấy rằng những nhận xét và câu trả lời của tôi rất hữu ích cho bạn để khôi phục câu hỏi tốt hơn (mặc dù bạn không thừa nhận nó). (2) Tôi hy vọng rằng bạn biết rằng, các tập hợp các trận đấu không chồng chéo mà S và T có trên T không được xác định rõ vì có thể có một số tập hợp các trận đấu không chồng chéo. Bạn đang nói về danh sách mà một trận đấu regex toàn cầu ( //gtrong Perl) sẽ trở lại?
Tsuyoshi Ito

2
Câu hỏi của bạn cần làm sáng tỏ; bạn vẫn đang nói về việc "chấp nhận" một trận đấu khi tham lam và không tham lam không thay đổi những gì được chấp nhận; nó chỉ là một phương tiện để xác định trận đấu nào sẽ được xác định khi tìm kiếm một trận đấu và tìm thấy nhiều trận đấu.
Eamon Nerbonne

Câu trả lời:


3

Câu trả lời này dựa trên giả định rằng sự tương đương của hai biểu thức chính được xác định khi chúng nhận ra cùng một ngôn ngữ. Nó không trả lời câu hỏi hiện tại.


Bạn có một sự hiểu lầm phổ biến rằng các bộ lượng tử miễn cưỡng thay đổi tập hợp các chuỗi biểu thức chính quy khớp. Nó không, và nó chỉ thay đổi tùy chọn nào được thử trước tiên.

Ví dụ: nếu bạn thực hiện khớp regex 'aaaa' =~ /a+/trong Perl, nó sẽ tìm thấy kết quả khớp đầu tiên trong chuỗi aaaavà ghi nhớ chuỗi con nào khớp với nó trong một biến đặc biệt. Ngay cả khi có nhiều hơn một chuỗi con aaaaphù hợp với biểu thức chính quy, các trận đấu khác với trận đấu đầu tiên sẽ bị bỏ qua.

Cho dù số lượng là tham lam hay miễn cưỡng ảnh hưởng đến trận đấu đầu tiên trong số nhiều trận đấu, nhưng tập hợp các trận đấu không thay đổi. Theo nghĩa này, tập hợp các chuỗi mà regex khớp với nhau là không thay đổi cho dù bạn sử dụng các bộ lượng tử tham lam thông thường hay bộ lượng tử miễn cưỡng.


Không, tôi không nói về tập hợp các trận đấu mà một mẫu không được cung cấp sẽ có trên một chuỗi nhất định. Tôi đang nói về tập hợp các chuỗi mà một mẫu nhất định sẽ khớp hoàn toàn với các chuỗi đó. Nói cách khác, tôi quan tâm đến việc viết lại các mẫu để duy trì tính tương đương trên tập hợp các chuỗi mà kết quả khớp đầu tiêntoàn bộ chuỗi . a+a+?không tương đương theo nghĩa này: aaaakhông phải là một kết hợp cho cái sau.
uckelman

1
@uckelman: Theo định nghĩa của bạn, chuỗi abbbkhông nằm trong L ( a*(..)*) vì khớp đầu tiên trong chuỗi abbbvới regex a*(..)*abb. Đó không phải là định nghĩa chuẩn của ngôn ngữ được nhận biết bởi một biểu thức chính quy. Nếu đó thực sự là những gì bạn quan tâm, bạn nên đặt tên khác.
Tsuyoshi Ito

uckelman, tôi khá chắc chắn a+?phù hợp aaaa. Tôi biết rằng regexpes Ruby làm.
Raphael

@Raphael: Tôi đoán rằng bạn đang nói về việc "aaaa" =~ /a?/trả về true trong Ruby, nhưng đó là vì mô hình khớp với một chuỗi con aaaa chứ không phải vì nó khớp aaaa.
Tsuyoshi Ito

Tôi đã bỏ lỡ một +(đã chỉnh sửa) và Ruby dường như khớp với toàn bộ từ (cf rubular.com).
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.