Вопрос академический - в любом случае нет необходимости в $
якорях в вашем регулярном выражении.Вы должны использовать \n
, чтобы соответствовать символам новой строки, потому что $
соответствует только разрыву между переводом строки и символом перед ним.
РЕДАКТИРОВАТЬ: Я пытаюсь сказать, что вы будете никогда нужно использовать $
таким образом.Любое совпадение, которое проходит от одной строки к следующей, должно использовать разделитель строк каким-либо образом .Рассмотрим ваш пример:
/^\[INFO\]$(.*?)$\[INFO\]/ms
Если это скомпилируется, (.*?)
начнёт с потребления первого перевода строки и продолжит работу до совпадения \nxyz
, где второй $
будет успешным.Но следующий символ - это перевод строки, и регулярное выражение ищет [
, так что это не работает.После возврата (.*?)
неохотно потребляет еще один символ - второй перевод строки - но тогда $
завершится неудачей.
Каждый раз, когда вы пытаетесь сопоставить EOL с $
, а затем еще чем-то, первым «материалом», который вам нужно будет сопоставить, будет перевод строки, так почему бы не сопоставить это вместо этого?Вот почему Perl-компилятор регулярных выражений пытается интерпретировать $\
как имя переменной в вашем регулярном выражении: нет смысла иметь привязку конца строки, за которой следует символ, не являющийся разделителем строк.