Как исправить это многострочное регулярное выражение в Ruby?

У меня есть регулярное выражение в Ruby, которое не работает должным образом в многострочном режиме.

Я пытаюсь преобразовать текст Markdown в разметку Textile-eque, используемую в Redmine. Проблема в моем регулярном выражении для преобразования блоков кода. Он должен найти любые строки, начинающиеся с 4 пробелов или табуляции, затем заключите их в теги pre .

markdownText = '# header

some text that precedes code

    var foo = 9;
    var fn = function() {}

    fn();

some post text'

puts markdownText.gsub!(/(^(?:\s{4}|\t).*?$)+/m,"
\n\\1\n
")

Предполагаемый результат:

# header

some text that precedes code

    var foo = 9;
    var fn = function() {}

    fn();
some post text

Проблема в том, что закрывающий тег pre печатается в конце документа, а не после "fn ( ); ". Я пробовал несколько вариантов следующего выражения, но оно не соответствует:

gsub!(/(^(?:\s{4}|\t).*?$)+^(\S)/m, "
\n\\1\n
\\2")

Как заставить регулярное выражение соответствовать только блоку кода с отступом? Вы можете проверить это регулярное выражение на Rubular здесь .

7
задан DonovanChan 19 April 2011 в 16:08
поделиться