Tengo archivos de rebajas que a veces tienen un solo H2, pero a veces también varios de ellos:

# This is H1

Some content.

## This is a H2

Some more content.

## This is another H2

Even more content.

Estoy escribiendo un método en Ruby para extraer el contenido de esos H2. Por ejemplo, quiero extraer el contenido del primer H2. Para esto, se le ocurrió la siguiente expresión regular:

^## This is a H2\n\n(.*)\n\n##

Lamentablemente, esto solo funciona cuando hay otro H2 en la rebaja. Pero no sé cómo hacer que la última parte \n\n## sea opcional, porque agregarle un ? (^\n## In Kürze\n\n(.*)[\n\n##]?) hará que funcione para la rebaja con solo un H2, pero lo hará capturar todos los H2 siguientes y su contenido cuando haya varios.

Espero que entiendas lo que quiero decir. Simplemente quiero obtener el contenido de un solo H2, independientemente de cuántos H2 haya.

Puedes jugar con mi trabajo aquí: https://rubular.com/r/JVaYHHzglxdLdK

0
Joshua Muheim 13 mar. 2021 a las 19:46

1 respuesta

La mejor respuesta

Creo que este patrón resuelve tu problema. Coincide con el contenido de las secciones H2 y termina al comienzo de las secciones H1 / H2, así como al final del archivo.

/(?:^|\n)##\s[^\n]*\n(.*?)(?=\n##?\s|$)/gs
(?:^|\n)                // make sure we're at the start of a line
##\s                    // match only H2 tags
[^\n]*\n                // skip the heading name
(.*?)                   // match heading content lazily
(?=                     // use a lookahead as to not consume the next heading's start tag
   \n##?\s              // terminate at H1 and H2 headings...
   |$                   // ...or at the end of the file
)

https://regex101.com/r/PB80CH/2

Los indicadores habilitados deben ser g lobal y s ingleline, no pueden usar el modo multilínea debido a la lógica especial para H2s que continúan hasta el final del archivo.

0
Mario Welzig 14 mar. 2021 a las 00:33