Escribí una expresión regular para recuperar una cadena de HTML, pero parece que la bandera multilínea no funciona.
Este es mi patrón y quiero obtener el texto en la h1etiqueta.
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];
Creé una cadena para probarlo. Cuando la cadena contiene "\ n", el resultado es siempre nulo. Si eliminé todos los "\ n" s, me dio el resultado correcto, sin importar con o sin la /mbandera.
¿Qué le pasa a mi expresión regular?
javascript
regex
Peter Mortensen
fuente
fuente

dotAllmodificador para que pueda hacerlo/.../sy sus puntos también coincidirán con nuevas líneas. A partir de julio de 2017, está detrás de una bandera en Chrome.Respuestas:
Está buscando el
/.../smodificador, también conocido como modificador dotall . Obliga al punto.a coincidir también con las nuevas líneas, lo que no hace de manera predeterminada.La mala noticia es que
no existe en JavaScript(lo hace a partir de ES2018, ver más abajo) . La buena noticia es que puede solucionarlo utilizando una clase de caracteres (por ejemplo\s) y su negación (\S) juntos, de esta manera:Entonces, en su caso, la expresión regular se convertiría en:
A partir de ES2018, JavaScript admite el
sindicador (dotAll), por lo que en un entorno moderno su expresión regular podría ser como la escribió, pero con unsindicador al final (en lugar dem;mcambia cómo^y$funciona, no.):fuente
., pero la coincidencia de espacios en blanco también (\s) significa que coincide\n(lo.que no funciona en JavaScript, o puede hacerse con lasbandera).[^]también funciona para que coincida con cualquier carácter, incluidas las nuevas líneas, en JavaScript. Ver developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…*?cuantificador en lugar de*evitar la codicia. Esto evitará atrapar el último <h1> del documento: eso probablemente no sea lo que desea y eso no es eficiente ya que la expresión regular continuará buscando <h1> hasta el final de la cadena, incluso si ya lo ha encontrado antes.Desea el
smodificador (dotall), que aparentemente no existe en Javascript; puede reemplazarlo.con [\ s \ S] como lo sugiere @molf. Elmmodificador (multilínea) hace que ^ y $ coincidan líneas en lugar de toda la cadena.fuente
sbandera (ES2018). :-)[\s\S]no funcionó para mí en nodejs 6.11.3. Basado en la documentación de RegExp , dice usar[^]lo que funciona para mí.Por ejemplo:
/This is on line 1[^]*?This is on line 3/mdonde el *? es la captura no codiciosa de 0 o más ocurrencias de [^].
fuente
[^]significa: es como una doble negación: "coincidir con cualquier personaje que no esté en esta lista vacía ", por lo que todo se reduce a decir "coincidir con cualquier personaje" .El modificador dotall ha llegado a JavaScript en junio de 2018, es decir, ECMAScript 2018.
https://github.com/tc39/proposal-regexp-dotall-flag
fuente
Mi sugerencia es que es mejor dividir la cadena de varias líneas con "\ n" y concatenar las divisiones de la cadena original y se convierte en una sola línea y fácil de manipular.
fuente