#javascript #regex #heredoc
#javascript #регулярное выражение #heredoc
Вопрос:
У меня есть скрипт на perl, который выглядит, например, следующим образом:
#/usr/bin/perl -w
print 'My output: ';
print <<END;
Here is more content
which is printed with
heredoc style
END
print 'End of output';
Теперь я хочу извлечь содержимое вышеупомянутого heredoc для печати с помощью JavaScript. Результат должен выглядеть следующим образом:
<<END;
Here is more content
which is printed with
heredoc style
END
Я пробовал это с <<END(.|n)*END
помощью . Это работает, если документ содержит только один heredoc, но не если он содержит более одного heredoc.
Так, например, если мой скрипт на perl выглядит следующим образом:
#/usr/bin/perl -w
print 'My output: ';
print <<END;
Here is more content
which is printed with
heredoc style
END
print <<END;
Here is even more content
which is printed with
heredoc style
END
print 'End of output';
Регулярное выражение соответствует:
<<END;
Here is more content
which is printed with
heredoc style
END
print <<END;
Here is even more content
which is printed with
heredoc style
END
Но оно должно соответствовать
<<END;
Here is more content
which is printed with
heredoc style
END
и
<<END;
Here is even more content
which is printed with
heredoc style
END
У кого-нибудь есть идея, что не так с моим регулярным выражением?
Другой вопрос: возможно ли только с помощью регулярных выражений перехват всех heredoc, где он не указан в строке heredoc END
?
Ответ №1:
Проблема в том, что *
по умолчанию оно «жадное». *
фиксирует все, что может соответствовать, до тех пор, пока шаблон, предшествующий *
сбою. Только тогда оно возвращается. В вашем случае шаблон действителен до конца вашей строки.
Чтобы он не был жадным и проверял, прошло ли оно точку, в которой оно должно заканчиваться (см., Что я там сделал? : D), добавьте ?
после *
.
<<END(.|n)*?END
Комментарии:
1. Хорошее решение. Как вы думаете, возможно ли захватить строку heredoc без указания строки heredoc
END
?2. @BenjaminJ. Ищите «обратную ссылку».
3. Большое вам спасибо. Мое решение
<<((.)*);n(.|n)*?1