Это должно работать
(?s).*(?=<)
Выражение (? S) переходит в режим одной линии, что позволяет. для соответствия новым строкам, а положительный результат позволяет выражению остановиться на <, не потребляя его (т. е. добавляя его в соответствие)
Следует помнить, что * жадный, то есть он будет останавливаться в последнем матче, а не в первом. Поэтому, если у вас есть <end of file>
дважды в том же файле, он будет соответствовать всем текстам до второго.
Если вы хотите, чтобы поймать повторяющиеся ВФ теги (с ВФ тега), вы могли бы сделать что-то вроде этого
(?s)([^>]+>)
Или без тегов ВФ
(?s)([^<]+)(?:[^>]+>)
В обоих случаях мы используем отрицательный класс символов для соответствия любому символу, кроме < или>. Мы останавливаемся, когда один из них попал, и начнем новый матч.
'\ n (?! <)'. Это называется отрицательным прогнозом. – eph
@eph Спасибо, как за ответ, так и за терминологию, чтобы я мог найти учебник для этого – Scotty
@Scotty, которому нужны учебники, когда у вас есть стек :) Если что-то нуждается в разъяснении или регулярное выражение не работает, просто скажите, и я я уверен, что вы получите ответ. Кроме того, текст, который вы сопоставляете, кажется немного надуманным, учитывая, что (? S). * На самом деле соответствует тому, что вы просили. Поэтому, возможно, добавление примера более реальной жизни поможет, если ответы ниже не будут выполнены, что вы были после – swestner