Tengo una expresión regular en Ruby que no funciona correctamente en el modo multilínea.¿Cómo soluciono esta expresión regular de varias líneas en Ruby?
Estoy tratando de convertir texto de reducción en el marcado Text-eque utilizado en Redmine. El problema está en mi expresión regular para convertir bloques de código. Debe encontrar las líneas que conducen con 4 espacios o una pestaña, luego envuélvalos en pre etiquetas.
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</pre>")
resultado previsto:
# header
some text that precedes code
<pre>
var foo = 9;
var fn = function() {}
fn();
</pre>
some post text
El problema es que el cierre pre etiqueta se imprime al final del documento en lugar de después de "fn();". Probé algunas variantes de la siguiente expresión, pero no coincide:
gsub!(/(^(?:\s{4}|\t).*?$)+^(\S)/m, "<pre>\n\\1\n</pre>\\2")
¿Cómo consigo la expresión regular para que coincida con sólo el bloque de código sangrado? Puede probar esta expresión regular en Rubular here.
por qué no incluir nueva línea en su expresión regular: '((:?.? \ S {4} | t \) * \ n) +' –
posible duplicado de [partidos RegEx etiquetas de apertura, excepto XHTML auto-contenido tags] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –
@Mladen Jablanovic No pude conseguir que tu ejemplo funcione con este código: 'puts markdownText.gsub! (/ ((?: \ s {4} | \ t). *? \ n) + /,"
")'. ¿Cómo se comportaría '\ n' de forma diferente a' $ '? – DonovanChan