Я думаю, что есть выход из режима кода с любым завершающим переводом строки, за которым не следует ни табуляция, ни 4 пробела. Не уверен, но последующие символы новой строки не будут включены в блок кода.
Я не слишком хорошо понимаю параметры регулярных выражений в Ruby, но, похоже, это работает: http://rubular.com/r/BlbreoO3sn
((?:^(?:[ ]{4}|\t).*$(?:\r?\n|\z))+)
Теоретически, это в многострочном режиме.
Просто сделайте замену \1
EDIT
@Rachela Meadows - После дальнейшего изучения это довольно сложное регулярное выражение.
Мне удалось точно продублировать функциональные возможности блока <pre><code>
онлайн-редактора здесь, на SO.
После получения каждого блока и перед переносом в <pre><code>
все объекты разметки должны быть преобразованы (т. Е. Как <
в <
и т. Д.) При этом я не делал этот шаг в примере кода Ruby ниже. У меня есть регулярные выражения для этого.
Специальное примечание об обрезке: основное регулярное выражение, приведенное ниже, не включает в себя остаточные завершающие символы новой строки. Так же как и функциональность SO. Таким образом, блок кода является правильным сверху вниз.
Однако первые 4 пробела (или табуляция), которые могут содержать в теле, не могут быть обрезаны (и они должны быть) в главном регулярном выражении. Для этого нужен обратный звонок.
Игра с режимом gsub
block , легко обрезать ведущие пробелы / табуляцию.
Дайте мне знать, если у вас есть какие-либо проблемы с этим.
Ссылки -
Рубул (для регулярных выражений): http://rubular.com/r/pp9oRLQ0xo
Ideone (для рабочего кода Ruby): http://ideone.com/aA9it
Regex сжатый -
(^\s*$\n|\A)(^(?:[ ]{4}|\t).*[^\s].*$\n?(?:(?:^\s*$\n?)*^(?:[ ]{4}|\t).*[^\s].*$\n?)*)
Regex расширен -
(^\s*$\n|\A) # Capt grp 1, block is preceeded by a blank line or begin of string
( # Begin "Capture group 2", start of pre/code block
^(?:[ ]{4}|\t) .* [^\s] .* $ \n? # First line of code block (note - lines must contain at least 1 non-whitespace character)
(?: # Start "Optionally, get more lines of code"
(?: ^ \s* $ \n? )* # Many optional blank lines
^(?:[ ]{4}|\t) .* [^\s] .* $ \n? # Another line of code
)* # End "Optionally, get more lines of code", do 0 or more times
) # End "Capture group 2", end of pre/code block
Рубиновый код -
regex = /(^\s*$\n|\A)(^(?:[ ]{4}|\t).*[^\s].*$\n?(?:(?:^\s*$\n?)*^(?:[ ]{4}|\t).*[^\s].*$\n?)*)/;
data = '
Hello Worldsasdasdffasdfasdf asdf
thisdqweee
asdfasdfasdfasdf
sdfg
#YYYY {
height: 100%;
min-height: 800px;
margin-right: 20px;
position: relative;
}
#ZZZZZZ {
height: 100%;
overflow: hidden;
}';
# ---
result = data.gsub(regex) {
||
x=$2;
## Construct the return value '\1<pre><code>\2</code></pre>'.
## But, trim each line with 1 to 4 leading spaces (or a tab with regex on the bottom).
## They are not necessary now, they are replaced with a code block.
$1 + '<pre><code>' + x.gsub(/^[ ]{1,4}/, '') + '</code></pre>'
};
# Note - Tabs can be trimed too, use : x.gsub(/^(?:[ ]{1,4}|\t)/,'') in the above
print result;