регулярное выражение для отслеживания heredoc в JavaScript

#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