2011-10-23 30 views
11

Tôi đã đọc "Làm chủ biểu thức chính quy" của Friedl và cố gắng đưa ra một biểu thức mẫu không tham lam chung cho một chuỗi được phân tách bằng một từ. Bắt đầu từ căn bản mà từ phân định chỉ là một ký tự đơn 'một' biểu thức:Biểu thức mô hình không tham lam

sed -r 's/([^a]*)(a)/\                 
(1)\1(2)\2(ALL)&(END)/g' <<<"xaxxaxxxaxxx...aa..." 

(1)x(2)a(ALL)xa(END) 
(1)xx(2)a(ALL)xxa(END) 
(1)xxx(2)a(ALL)xxxa(END) 
(1)xxx...(2)a(ALL)xxx...a(END) 
(1)(2)a(ALL)a(END)... 

từ đó mô hình (có sự tham khảo Friedl) có thể là:

  • [bình thường * đóng]

Chuyển sang thực tế đa ký tự ' ab 'delimiter:

sed -r 's/([^a]*)((a[^b]*)*)(ab)/\       
(1)\1(2)\2(3)\3(4)\4(ALL)&(END)/g' <<<"xabxxabxxxabxxx...abxxx...aabxxx...axxx...aaabxaabaxabaxaxabxaxaabxxaaabaaxxab..." 

(1)x(2)(3)(4)ab(ALL)xab(END) 
(1)xx(2)(3)(4)ab(ALL)xxab(END) 
(1)xxx(2)(3)(4)ab(ALL)xxxab(END) 
(1)xxx...(2)(3)(4)ab(ALL)xxx...ab(END) 
(1)xxx...(2)a(3)a(4)ab(ALL)xxx...aab(END) 
(1)xxx...(2)axxx...aa(3)axxx...aa(4)ab(ALL)xxx...axxx...aaab(END) 
(1)x(2)a(3)a(4)ab(ALL)xaab(END) 
(1)(2)ax(3)ax(4)ab(ALL)axab(END) 
(1)(2)axax(3)axax(4)ab(ALL)axaxab(END) 
(1)x(2)axa(3)axa(4)ab(ALL)xaxaab(END) 
(1)xx(2)aa(3)aa(4)ab(ALL)xxaaab(END) 
(1)(2)aaxx(3)aaxx(4)ab(ALL)aaxxab(END)... 

từ đó mô hình có thể là:

  • [* bình thường (đặc biệt *) * đóng]

Đối với tiếp theo' abc 'delimiter the specia l biểu thức có thể được mở rộng để:

(a[^b]*)*(ab[^c]*)* 
  1. Đây có phải là đúng?
  2. Nó có thể được chứng minh không?
  3. Có thể đơn giản hóa biểu thức đặc biệt?
  4. Có các biểu thức tốt hơn/hiệu quả hơn cho việc này không? n.b. Tôi không sử dụng perl 'không tham lam' *? ' điều hành và tránh thay đổi.
  5. Tôi có thể tìm tài liệu tham chiếu đến loại vấn đề này ở đâu (Friedl ám chỉ nhưng đã dừng một giải pháp đã xuất bản).
+0

Tôi còn cách xa "Làm chủ các cụm từ thông dụng" thậm chí không hề vui. Tôi bị can thiệp tuy nhiên. Bạn có muốn giải thích tại sao bạn không muốn sử dụng hai toán tử đó không? và | Cảm kích điều đó. – Mithon

+0

Tại sao không sử dụng lookahead tiêu cực? – lkuty

+0

@ Ikuty Tôi e rằng đó không phải là một phần của bản báo cáo của sed. – potong

Trả lời

1
  1. Vâng, có vẻ đúng.
  2. Bạn muốn đọc về tự động hữu hạn - không xác định (NFA) và xác định (DFA). Các hệ thống regexp đơn giản về bản chất là một ký pháp hữu ích cho các automata hữu hạn. Bất kỳ cuốn sách hay nào về trình biên dịch sẽ có một chương bao gồm NFA và DFA.
  3. Có lẽ không, hoặc không nhiều. Từ của bạn càng dài, bạn càng cho phép nhiều bản nhạc nền.
Các vấn đề liên quan