У меня есть регулярное выражение в Ruby, которое не работает должным образом в многострочном режиме.
Я пытаюсь преобразовать текст Markdown в текстовую разметку, используемую в Redmine. Проблема в моем регулярном выражении для преобразования блоков кода. Он должен найти любые строки, начинающиеся с 4 пробелов или табуляции, а затем обернуть их в теги pre .
<code>markdownText = '# header
some text that precedes code
var foo = 9;
var fn = function() {}
fn();
some post text'
puts markdownText.gsub!(/(^(?:\s{4}|\t).*?$)+/m,"<pre>\n\\1\n
")
Ожидаемый результат:
<code># header
some text that precedes code
<pre>
var foo = 9;
var fn = function() {}
fn();
некоторый текст поста
Проблема в том, что закрывающий тег pre печатается в конце документа, а не после "fn ();". Я попробовал несколько вариантов следующего выражения, но оно не соответствует:
<code>gsub!(/(^(?:\s{4}|\t).*?$)+^(\S)/m, "<pre>\n\\1\n
\\ 2" )
Как заставить регулярное выражение соответствовать только блоку с отступом кода? Вы можете проверить это регулярное выражение на Rubular здесь .