Kết hợp nhiều hoạt động nhất của bất kỳ char nào


8

Trên https://www.emacswiki.org/emacs/MultilineRegapi người ta tìm thấy gợi ý để sử dụng

[\ 0- \ 377 [: nonascii:]] * \ n

thay vì tiêu chuẩn

. * \ n

để khớp bất kỳ ký tự nào lên một dòng mới để tránh tràn ngăn xếp cho các văn bản lớn (37 KB). Là sự tràn ngập mối quan tâm ở đây, hoặc là một hoạt động phù hợp cho cái trước cũng hiệu quả hơn cái sau?

Câu trả lời:


9

Trong biểu thức chính của Emacs, .không khớp với tất cả các ký tự. Nó là một từ đồng nghĩa của [^\n]. Vì vậy, lý do để sử dụng [\0-\377[:nonascii:]]là khi bạn muốn khớp "bất kỳ char nào, thậm chí là một dòng mới".

Wrt tràn ngăn xếp, .*\nnên được xử lý rất hiệu quả, tức là không quay lại và không ăn hết ngăn xếp. Ngược lại, [\0-\377[:nonascii:]]*\nđược xử lý khá kém hiệu quả bởi công cụ regrec của Emacs vì nó sẽ ăn một chút ngăn xếp cho mỗi ký tự khớp, do đó, trên các văn bản "khổng lồ", nó sẽ có xu hướng tràn vào ngăn xếp.

Lưu ý rằng emacswiki gợi ý [\0-\377[:nonascii:]]*và không [\0-\377[:nonascii:]]*\n.


Cảm ơn bạn đã làm rõ. Tuy nhiên, đối với tràn ngăn xếp, bạn có chắc chắn rằng [\ 0- \ 377 [: nonascii:]] * \ n sẽ gây ra tràn? Điều này trái ngược với những gì wiki tuyên bố. Đây có phải là bcs của \ n ở cuối không? Việc sử dụng một mẫu như [\ 0- \ 377 [: nonascii:]] * mà không có ký tự kết thúc là gì?
Vroomfondel

Bất kỳ regrec nào phù hợp với "bất cứ thứ gì" sẽ ăn hết dung lượng ngăn xếp (với công cụ regrec của Emacs, ý tôi là vậy) và tôi không hiểu tại sao [\0-\377[:nonascii:]]*lại làm như vậy ít hơn \\(.\\|\n\\)*. Vì vậy, tôi nghĩ rằng emacswiki là sai về điều này.
Stefan

Bất kỳ cách nào (hoặc bất cứ ai) để ủy quyền làm rõ về vấn đề này?
Vroomfondel

@Vroomfondel kiểm tra nó và xem. Tôi có thể tưởng tượng rằng regrec với |có thể cần quay lại nhiều hơn, nhưng liệu nó có thực sự phụ thuộc vào cách nó được biên dịch hay không.
npostavs

3
Điều đó chỉ đúng nếu regrec kết thúc bằng [\0-\377[:nonascii:]]*(điều này khá bất thường, vì bạn cũng có thể sử dụng point-maxchứ không phải tìm kiếm thông qua regrec như vậy) (đối với sự tò mò: mấu chốt của vấn đề là liệu bộ ký tự có khớp với nhau không sau * là rời nhau từ tập các char mà có thể phù hợp trong *. Nếu đó là rời nhau, sau đó động cơ regexp sẽ bỏ qua các bước trung gian ghi âm, và do đó tránh ăn lên không gian ngăn xếp. Vì vậy, .*\n[^a]*akhông tiêu thụ chồng, trong khi .*alàm).
Stefan
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.