Regex để phù hợp với bất kỳ nhân vật bao gồm các dòng mới


223

Có regex nào phù hợp với "tất cả các ký tự bao gồm cả dòng mới" không?

Ví dụ: trong regex bên dưới, không có đầu ra từ $2(.+?)không bao gồm các dòng mới khi khớp.

$string = "START Curabitur mollis, dolor ut rutrum consequat, arcu nisl ultrices diam, adipiscing aliquam ipsum metus id velit. Aenean vestibulum gravida felis, quis bibendum nisl euismod ut. 

Nunc at orci sed quam pharetra congue. Nulla a justo vitae diam eleifend dictum. Maecenas egestas ipsum elementum dui sollicitudin tempus. Donec bibendum cursus nisi, vitae convallis ante ornare a. Curabitur libero lorem, semper sit amet cursus at, cursus id purus. Cras varius metus eu diam vulputate vel elementum mauris tempor. 

Morbi tristique interdum libero, eu pulvinar elit fringilla vel. Curabitur fringilla bibendum urna, ullamcorper placerat quam fermentum id. Nunc aliquam, nunc sit amet bibendum lacinia, magna massa auctor enim, nec dictum sapien eros in arcu. 

Pellentesque viverra ullamcorper lectus, a facilisis ipsum tempus et. Nulla mi enim, interdum at imperdiet eget, bibendum nec END";

$string =~ /(START)(.+?)(END)/;

print $2;

1
Bạn có thể muốn đọc về các công cụ sửa đổi / cờ regex như: m, s (m / regex / ims ...)
snoustkin

Câu trả lời:


194

Thêm công cụ ssửa đổi vào biểu thức chính quy của bạn .để khớp với dòng mới:

$string =~ /(START)(.+?)(END)/s;

32
Trong JavaScript: (START) [\ s \ S] * (END) - Xem
www.regapidal.com

1
Để biết thêm thông tin về nhận xét của @ Zymotik, hãy xem: stackoverflow.com/questions/1068280/
Jacob van Lingen

2
Trong Java, bạn có thể sử dụng (các) công cụ sửa đổi nội tuyến ở đầu regex, ví dụ để thay thế bất kỳ ký tự nào, kể cả các dòng mới sau khi sử dụng 'yourPotype' "(?s)yourPattern.*"- Xem thêm: rexegg.com/regex-modifier.html#dotall
LukeSolar

Trong Ruby, công cụ sửa đổi là mkhông s. Xem: rubular.com
Jon Schneider

312

Nếu bạn không muốn thêm công cụ /ssửa đổi regex (có lẽ bạn vẫn muốn .giữ lại ý nghĩa ban đầu của nó ở nơi khác trong regex), bạn cũng có thể sử dụng một lớp ký tự. Một khả năng:

[\S\s]

một nhân vật không phải là một không gian hoặc là một không gian. Nói cách khác, bất kỳ nhân vật.

Bạn cũng có thể thay đổi bộ sửa đổi cục bộ trong một phần nhỏ của biểu thức chính, như vậy:

(?s:.)

2
+1 Tôi vừa mới bắt đầu sử dụng (?s:.)cú pháp.
BoltClock

(?:.|\n)kém hơn trong bất kỳ cách nào, ngoại trừ là kém thanh lịch?
Vlastimil Ovčáčík

([\S\s]+)là những gì tôi đang tìm kiếm. Cảm ơn. +1
Ryan

@ VlastimilOvčáčík Điều đó có thể rất tệ cho thời gian chạy nếu bạn sử dụng nó với *hoặc +vì có 2 ^ n cách khác nhau, nó có thể khớp với bất kỳ chuỗi nào có độ dài n.
Radon Rosborough

8

Yeap, bạn chỉ cần tạo .dòng mới phù hợp:

$string =~ /(START)(.+?)(END)/s;

-5

Bạn muốn sử dụng "multiline".

$string =~ /(START)(.+?)(END)/m;

6
Không, mảnh hưởng đến ^$neo nhưng không ..
BoltClock

Thú vị, cảm ơn. Đoán tôi chưa bao giờ cố gắng làm chính xác những gì OP đang yêu cầu.
nadime
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.