2011-11-28 39 views
134

Có regex nào khớp với "tất cả ký tự bao gồm cả dòng mới" không?Regex để khớp với bất kỳ ký tự nào bao gồm các dòng mới

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 đối sánh.

$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; 
+0

Bạn có thể muốn đọc về bổ regex/cờ như: m, s (m/regex/ims. ..) – snoofkin

Trả lời

121

Thêm s modifier để regex của bạn để gây . để phù hợp với dòng mới:

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

Trong JavaScript: (START) [\ s \ S] * (END) - Xem www.regexpal.com để kiểm tra – Zymotik

+1

Để biết thêm thông tin về nhận xét của @ Zymotik, hãy xem: http://stackoverflow.com/questions/1068280/javascript -regex-multiline-flag-doesnt-work –

-2

Bạn muốn sử dụng "nhiều dòng".

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

Không, 'm' ảnh hưởng đến'^'và' $ 'anchors nhưng không ảnh hưởng' .'. – BoltClock

+0

Thú vị, cảm ơn. Đoán tôi đã không bao giờ cố gắng làm chính xác những gì OP đang yêu cầu. – nadime

5

Yeap, bạn chỉ cần phải thực hiện . trận đấu xuống dòng:

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

+1 để bị trễ 16 giây. =) – TLP

+0

@TLP lol Cảm ơn :) – FailedDev

198

Nếu bạn không muốn thêm công cụ sửa đổi regex /s (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 nhân vật. Một khả năng:

[\S\s] 

một ký tự không phải là dấu cách hoặc khoảng trắng… nói cách khác, bất kỳ ký tự nào.

Bạn cũng có thể thay đổi từ bổ nghĩa cục bộ trong một phần nhỏ của regex, như vậy:

(?s:.) 
+2

+1 Tôi đã chuẩn bị tập trung vào cú pháp '(? S:.)'. – BoltClock

+7

+1 cho tính mới. '\ d \ D',' \ w \ W' cũng hoạt động. =) – TLP

+2

[\ S \ s] hoạt động trên các regex không phải perl, tức là gedit –

Các vấn đề liên quan