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 h1
etiqueta.
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 /m
bandera.
¿Qué le pasa a mi expresión regular?
javascript
regex
Peter Mortensen
fuente
fuente
dotAll
modificador para que pueda hacerlo/.../s
y 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
/.../s
modificador, 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
s
indicador (dotAll), por lo que en un entorno moderno su expresión regular podría ser como la escribió, pero con uns
indicador al final (en lugar dem
;m
cambia 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 las
bandera).[^]
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
s
modificador (dotall), que aparentemente no existe en Javascript; puede reemplazarlo.
con [\ s \ S] como lo sugiere @molf. Elm
modificador (multilínea) hace que ^ y $ coincidan líneas en lugar de toda la cadena.fuente
s
bandera (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/m
donde 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