Quiero transformar el siguiente textoSustitución de expresiones regulares parcial coincide en su lugar con Ruby
This is a ![foto](foto.jpeg), here is another ![foto](foto.png)
en
This is a ![foto](/folder1/foto.jpeg), here is another ![foto](/folder2/foto.png)
En otras palabras que quiero encontrar todas las rutas de las imágenes que se incluyen entre paréntesis (el texto está en la sintaxis de Markdown) y los reemplaza con otras rutas. La cadena que contiene la nueva ruta es devuelta por una función separada real_path
.
Me gustaría hacer esto usando String#gsub
en su versión de bloque. Actualmente mi código es el siguiente:
re = /!\[.*?\]\((.*?)\)/
rel_content = content.gsub(re) do |path|
real_path(path)
end
El problema con esto es que la expresión regular coincidirá con ![foto](foto.jpeg)
en lugar de sólo foto.jpeg
. También probé otras expresiones regulares como (?>\!\[.*?\]\()(.*?)(?>\))
pero fue en vano.
Mi solución actual es dividir la ruta y volver a montarla más tarde.
¿Hay una expresión regular de Ruby que coincida solo con la ruta dentro de los corchetes y no con todos los caracteres contextuales necesarios?
Actualización posterior a la respuesta: El principal problema aquí es que las expresiones regulares de Ruby no tienen forma de especificar el ancho cero detrás de ellas. La solución más genérica es agrupar lo que es la parte de regexp anterior y la que está después de la parte de coincidencia real, es decir, /(pre)(matching-part)(post)/
, y luego reconstruir la cadena completa.
En este caso la solución sería
re = /(!\[.*?\]\()(.*?)(\))/
rel_content = content.gsub(re) do
$1 + real_path($2) + $3
end
Tal vez la mejor idea es, como usted sugiere, para salvar la pieza antes y después del partido real en grupos separados y reconstruir la cadena final con '$ 1 + ruta_real ($ 2) + $ 3'. – gioele