Другие ответы здесь предполагают, что у вас есть механизм регулярных выражений, который поддерживает нежадное сопоставление, что является расширением, введенным в Perl 5 и широко копируемым на другие современные языки; но это ни в коем случае не повсеместно.
Многие старые или более консервативные языки и редакторы поддерживают только традиционные регулярные выражения, у которых нет механизма для управления жадностью оператора повторения *
- он всегда соответствует самой длинной возможной строке.
Уловка состоит в том, чтобы в первую очередь ограничить то, что разрешено совпадать. Вместо .*
вы, кажется, ищете
[^>]*
который по-прежнему соответствует как можно большему количеству чего-то; но что-то - это не просто .
"любой символ", а вместо этого "любой символ, который не является >
".
В зависимости от вашего приложения вы можете или не захотите включать параметр, разрешающий «любому символу» включать символы новой строки.
Даже если ваш механизм регулярных выражений поддерживает нежадное сопоставление, лучше объяснить, что вы на самом деле имеете в виду. Если это то, что вы имеете в виду, вам, вероятно, следует сказать это, вместо того, чтобы полагаться на ненадежное сопоставление с (надеюсь, возможно) Do What I Mean.
Например, регулярное выражение с конечным контекстом после подстановочного знака, такого как .*?><br/>
, будет перепрыгивать через любой вложенный >
, пока не найдет замыкающий контекст (здесь ><br/>
), даже если для этого потребуется разделить несколько экземпляров >
и символы новой строки, если вы позволите, где [^>]*><br/>
( или даже [^\n>]*><br/>
, если вам нужно явно запретить новую строку), очевидно, не может и не будет этого делать.
Конечно, это все еще не то, что вам нужно, если вам нужно справиться с <img title="quoted string with > in it" src="other attributes"> and perhaps <img title="nested tags">
, но на этом этапе вы должны наконец отказаться от использования для этого регулярных выражений, как мы все вам говорили в первую очередь.
person
tripleee
schedule
19.11.2018