2014-09-30 15 views
79

Tôi có regex này tại đây;Regex văn bản tuyệt vời không phát hiện thẻ đa dòng

\[sometag\](.*)\[/sometag\] 

Bắt buộc phải xem văn bản được bao quanh bởi thẻ [sometag]. Nó hoạt động cho thông tin dòng đơn chứa trong các thẻ này, như trên chuỗi [sometag]this is a bit of text[/sometag]. Nhưng nó không hoạt động trên văn bản kéo dài nhiều dòng, như thế này;

[sometag] here is more text 

it spans more than one line [/sometag] 

Vì lý do nào đó, công cụ tìm regex của văn bản tuyệt vời sẽ không nhận ra các thẻ trên nhiều dòng. Tôi muốn biết nếu đây là một vấn đề với Sublime Text, một lựa chọn có thể chuyển đổi, hoặc chỉ là sự bất tài cá nhân của tôi với các regex.

Trả lời

142

Khi bắt đầu, hãy sử dụng công cụ sửa đổi dotall (?s) để tạo dấu chấm cho phù hợp với ký tự dòng mới.

(?s)\[sometag\](.*?)\[\/sometag\] 

DEMO

+0

Cảm ơn! Tại sao tôi phải bao gồm những dấu hỏi phụ đó? – Maurdekye

+3

'?' Sau '*' sẽ thực hiện một kết quả không tham lam. Hãy xem xét '[b] foo [/ b] foo [b] thanh [/ b]' làm ví dụ. '\ [b \]. * \ [\/b \]' sẽ khớp toàn bộ từ điểm bắt đầu b đến điểm đóng cuối b. –

+0

chỉ phát bằng cách thêm và xóa '?' Trong http://regex101.com/r/gI0xC3/2 –

7

Nếu sửa đổi của chế độ chấm là không thể chấp nhận đối với một số lý do, bạn có thể mất rằng:

[sometag](.|\n)+?[/sometag] 
+2

Không bao giờ sử dụng '(. | \ N) +?' Nếu bạn có quyền truy cập vào công cụ sửa đổi DOTALL. Nếu bạn không thể sử dụng '(? S)' trong một số falvor, sử dụng '[\ s \ S]'/'[\ d \ D]'/'[\ w \ W]', nhưng không dùng patter xen kẽ được gợi ý ở đây. Mẫu này rất kém hiệu quả và có thể dễ dàng dẫn đến vấn đề thời gian chờ. –

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