Làm thế nào tham lam là sed trong mô hình phù hợp?


5

Tôi biết sed là tham lam khi kết hợp các mẫu. Nhưng, nó tham lam đến mức nào?

Hãy xem xét những ví dụ này.

$ echo 'foobar123' | sed 's/[0-9]*/(&)/'
()foobar123
$ echo 'foobar123' | sed 's/[0-9][0-9]*/(&)/'
foobar(123)

Tại sao không in ví dụ thứ hai foobar(1)23và thay vào đó là in foobar(123)?

Câu trả lời:


8

Đó là tham lam như nó có thể.

Mẫu đầu tiên ("bất kỳ chữ số nào từ 0 lần trở lên") khớp với mọi nơi, nhưng chỉ thực hiện một lần trong ví dụ của bạn vì không có gcờ.

So sánh:

$ echo foobar123 | sed 's/[0-9]*/(&)/g'
()f()o()o()b()a()r(123)

Lưu ý làm thế nào nó trở nên tham lam ngay khi có thể, tức là, có những chữ số trong đó nhiều hơn 0 có thể được tiêu thụ.

Điều tương tự đối với mẫu thứ hai ("bất kỳ chữ số nào, cộng với bất kỳ chữ số nào hoặc nhiều lần hơn"). Nó không thể phù hợp với bất cứ nơi nào trước 123. Khi đó, nó tiêu thụ càng nhiều càng tốt.


0

Lý do cho sự nhầm lẫn là

1) sed phù hợp càng sớm càng tốt (vì vậy ví dụ thứ nhất)
2) sed * càng tham lam càng tốt (vì vậy ví dụ thứ hai)

Trong chế độ một trận đấu, một khi nó đã tìm thấy một trận đấu, sed không tìm kiếm các trận đấu sau này, nơi nó có thể tham lam hơn.

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.