2013-05-30 26 views
5

Làm cách nào để regex khớp với mọi thứ nằm giữa hai chuỗi? Những thứ giữa hai chuỗi bao trùm một vài dòng và có thể chứa tất cả các ký tự html.Regex khớp mọi thứ giữa hai chuỗi, kéo dài nhiều dòng

Ví dụ:

<p>something</p> 

<!-- OPTIONAL --> 

<p class="sdf"> some text</p> 
<p> some other text</p> 

<!-- OPTIONAL END --> 

<p>The end</p> 

Tôi muốn lột toàn bộ phần tùy chọn tắt. nhưng tham lam bất kỳ trận đấu nhân vật không được làm những gì tôi muốn .. mô hình tôi đang sử dụng là

  • <!-- OPTIONAL -->.*<!-- OPTIONAL END -->
  • <!-- OPTIONAL -->(.*)<!-- OPTIONAL END -->
  • <!-- OPTIONAL -->(.*)\s+<!-- OPTIONAL END -->
  • (?=<!-- OPTIONAL -->)(.*)\s+<!-- OPTIONAL END -->

Tất cả trong số họ khớp với thẻ tùy chọn đầu tiên, nếu chỉ có phần đầu tiên được đưa ra, nhưng không hoạt động tốt với các dòng hoàn chỉnh.

Dưới đây là một ví dụ: http://regexr.com?352bk

Cảm ơn

+0

Bạn không nên sử dụng regex. http://stackoverflow.com/q/1732348/34397 – SLaks

+0

bạn đang sử dụng ngôn ngữ nào? – rednaw

+0

@SLaks làm phân tích cú pháp XML có nhận xét HTML vào tài khoản? – rednaw

Trả lời

5

Kiểm tra hộp kiểm dotall trong RegExr :)

Nếu không có lá cờ dotall (các s trong /regex/s), dấu chấm (.) sẽ không phù hợp Vận chuyển trở lại.

Bạn nên sử dụng .*? thay vì .* để so khớp lười với nội dung tùy chọn (xem câu PLEASE DO NOT MATCH! trong ví dụ).

+0

Aah! dotall là gì, và nó làm gì? – LocustHorde

+0

@LocustHorde Tôi đã chỉnh sửa. – sp00m

+0

@LocustHorde Theo mặc định, ký tự wildchard trong regex ('.') không khớp với các ký tự dòng mới, có nghĩa là regex ngừng tìm kiếm ở cuối dòng. Bằng cách bật dấu chấm thì '.' cũng sẽ bao gồm các ký tự dòng mới trong kết hợp của nó. –

1

Bật tùy chọn "dấu chấm" để. trong regex sẽ khớp với các ký tự dòng mới và làm việc trên nhiều dòng. Có nhiều cách khác nhau để thực hiện việc này tùy thuộc vào việc bạn triển khai regex, hãy kiểm tra hướng dẫn để triển khai.

+0

Cảm ơn (văn bản phụ) – LocustHorde

7

Để thực hiện một ungreedy regex, sử dụng một ? sau *:

<!-- OPTIONAL -->(.*?)<!-- OPTIONAL END --> 

Liệu điều này giúp bạn?

Cũng tùy thuộc vào ngôn ngữ lập trình bạn sử dụng, bạn có các công cụ sửa đổi sẽ làm cho dấu regex của bạn (.) khớp với dòng mới. Đối với PHP bạn có (dotall) modifier s ví dụ:

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

+0

Multiline không phải là những gì OP cần, nhưng là một dotall. Multiline sẽ làm cho các neo '^ $' khớp với nhiều dòng thay vì một dòng duy nhất. – sp00m

+0

Tốt nhất, đã sửa đổi câu trả lời của tôi – rednaw

+0

cảm ơn bạn! (văn bản phụ) – LocustHorde

1

chơi với ví dụ của bạn tôi nghĩ rằng tôi đã tìm thấy câu trả lời, kiểm tra điều này trong mã của bạn:

<!-- OPTIONAL -->[\w\W]*<!-- OPTIONAL END -->

Tôi hy vọng điều này sẽ giúp

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