2013-05-30 3 views
5

Как regex сопоставить все, что находится между двумя строками? Вещи между двумя строками охватывают несколько строк и могут содержать все символы html.Regex сопоставляет все между двумя строками, охватывая многострочные

Например:

<p>something</p> 

<!-- OPTIONAL --> 

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

<!-- OPTIONAL END --> 

<p>The end</p> 

Я хочу раздеть всю необязательную часть прочь. но жадный любой матч символ не делать то, что я хотел .. шаблон я использую

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

Все они соответствует первому необязательному тегу, если задана только первая часть, но не подходит для полных строк.

Вот пример: http://regexr.com?352bk

Благодаря

+0

Нельзя использовать регулярное выражение. http://stackoverflow.com/q/1732348/34397 – SLaks

+0

какой язык вы используете? – rednaw

+0

@SLaks ли XML-анализаторы учитывают HTML-комментарии? – rednaw

ответ

5

Проверить dotall флажок в RegExr :)

Без флага dotall (s в /regex/s), точка (.) не будет соответствовать возврат к перевозке.

Вы должны использовать .*? вместо .*, чтобы лениво совместить дополнительный контент (см. Предложение PLEASE DO NOT MATCH! в примерах).

+0

Aah! что такое dotall, и что он делает, пожалуйста? – LocustHorde

+0

@ LocustHorde Я отредактировал. – sp00m

+0

@LocustHorde По умолчанию символ wildchard в regex ('.') не соответствует символам новой строки, что означает, что регулярное выражение останавливает поиск в конце строки. Включив dotall, '.' также будет содержать символы новой строки в своем совпадении. –

1

Включите опцию «dotall», чтобы. в regex будет соответствовать символам новой строки и работать в нескольких строках. Существуют различные способы сделать это в зависимости от вашей реализации регулярного выражения, проверьте руководство для вашей реализации.

+0

Спасибо (текст наполнителя) – LocustHorde

7

Чтобы сделать регулярное выражение ungreedy, используйте ? после *:

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

ли это поможет?

Также в зависимости от используемого вами языка программирования у вас есть модификаторы, которые заставят вашу точку регулярного выражения (.) соответствовать символам новой строки. Для PHP вы имеете s (dotall) модификатор, например:

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

+0

Многострочный не то, что нужно OP, а одноэтажное. Multiline сделает якобы '^ $' совпадающими с несколькими строками вместо одного. – sp00m

+0

Хороший, измененный мой ответ – rednaw

+0

спасибо! (текст наполнителя) – LocustHorde

1

играет с вашим примером, я думаю, что я нашел ответ, проверить это в вашем коде:

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

Я надеюсь, что эта помощь

Смежные вопросы