Phân tích chuỗi nhiều dòng để chỉ trích xuất các dòng khớp


2

Tôi có một chuỗi nhiều dòng và tôi chỉ muốn trích xuất các dòng khớp với một mẫu nhất định và loại bỏ phần còn lại của chuỗi.

Chuỗi gốc:

lorem ipsum dolor sit amet consectetur
nunc KEEP THIS LINE ut massa lorem
DO NOT KEEP THIS LINE aenean blandit
nunc KEEP THIS LINE et justo quis
praesent at velit felis vel

Chuỗi mong muốn cuối cùng:

KEEP THIS LINE ut massa lorem
KEEP THIS LINE et justo quis

Regex tôi có cho đến nay là:

(?ms).*?(?-s)^nunc (KEEP THIS LINE.*?$)

Tôi chỉ có thể thay thế trận đấu bằng phản hồi \1. Tuy nhiên, điều này không thể thay thế từ cuối mẫu phù hợp cuối cùng đến cuối chuỗi.

Các regex:

(?ms).*?(?-s)(^nunc (KEEP THIS LINE.*?$)|(?s:).*?\Z)

xác định thành công mẫu giữa dòng mong muốn cuối cùng và cuối chuỗi, nhưng tôi không thể tìm ra cách loại bỏ nó.


1
Bạn phải luôn luôn chỉ ra chương trình bạn đang sử dụng. Hầu như luôn có sự khác biệt tinh tế giữa cách hai chương trình khác nhau thực hiện biểu thức chính quy, ngay cả khi chúng cùng "loại".
Dennis

Câu trả lời:


0

Thay thế ^(?:nunc (KEEP THIS LINE.*)|.*\n)$bằng \1sẽ đạt được đầu ra mong muốn:

  • Do công cụ thay thế ( |), biểu thức ^(?:nunc (KEEP THIS LINE.*)?|.*\n)$sẽ khớp mạnh mẽ với toàn bộ dòng, mà không bắt nó ( ?:chỉ định một nhóm không bắt).

  • Nếu dòng bắt đầu bằng nunc KEEP THIS LINE, \1sẽ đề cập đến bên trong của dấu ngoặc đơn, nghĩa là chuỗi bắt đầu bằng KEEP THIS LINEvà kết thúc ở cuối dòng.

  • Nếu dòng không bắt đầu bằng nunc KEEP THIS LINE, .*\nsẽ khớp với toàn bộ dòng, bao gồm cả ký tự dòng mới kết thúc.

Biểu thức chính quy ở trên hoạt động tốt với Perl.

Trong Notepad ++ với các ngắt dòng Windows, bạn có thể sử dụng cái này thay thế:

^(?:nunc (KEEP THIS LINE.*)|.*(\r\n)?)

Lưu ý rằng điều này sẽ chỉ loại bỏ dòng cuối cùng, không loại bỏ nó.


Cảm ơn đã giúp đỡ. Tôi đã sử dụng notepad ++, tài liệu nói về cơ bản giống như Perl, tuy nhiên giải pháp trên không hoạt động. Tất cả mọi thứ được đề cập ở trên có vẻ hợp lý, tôi nghĩ rằng nó chỉ thất bại cho việc thực hiện cụ thể này. Regex cuối cùng làm việc cho tôi là việc thêm biểu tượng không tẩy rửa như bạn có: (? S). *? (? - s) (?: ^ Nunc (KEEP NÀY LINE. *? $) | (? S :) . * \ Z)
smaxey

Có một sự khác biệt nhỏ trong cách Perl và Notepad ++ diễn giải $ký tự ở đây, nhưng vấn đề chính là các đầu cuối dòng của hệ điều hành. Linux sử dụng \nsau mỗi dòng (bao gồm cả dòng cuối cùng), Windows sử dụng \r\n(không nhất thiết phải sau dòng cuối cùng).
Dennis
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.