Texto multilínea de expresiones regulares de JavaScript entre dos etiquetas
Escribí una expresión regular para recuperar una cadena de HTML, pero parece que el indicador multilínea no funciona.
Este es mi patrón y quiero etiquetar el texto h1
.
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 siempre es nulo. Si eliminé todos los "\n", me dio el resultado correcto, sin importar si tenía o no la /m
bandera.
¿Qué pasa con mi expresión regular?
Está buscando el /.../s
modificador, también conocido como modificador dotall . Obliga al punto .
a coincidir también con nuevas líneas, lo que no hace de forma predeterminada.
La mala noticia es que no existe en JavaScript (existe a partir de ES2018, ver más abajo) . La buena noticia es que puedes solucionarlo usando una clase de carácter (por ejemplo \s
, ) y su negación ( \S
) juntas, así:
[\s\S]
Entonces, en su caso, la expresión regular se convertiría en:
/<div class="box-content-5">[\s\S]*<h1>([^<]+?)<\/h1>/i
A partir de ES2018, JavaScript admite el s
indicador (dotAll), por lo que en un entorno moderno su expresión regular podría ser tal como la escribió, pero con un s
indicador al final (en lugar de m
; m
cambia cómo ^
y $
funciona, no .
):
/<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/is
Desea el s
modificador (dotall), que aparentemente no existe en Javascript; puede reemplazarlo .
con [\s\S] como lo sugiere @molf. El m
modificador (multilínea) hace que ^ y $ coincidan con líneas en lugar de toda la cadena.
[\s\S]
no funcionó para mí en nodejs 6.11.3. Según la documentación de RegExp , dice usar [^]
lo que funciona para mí.
(El punto, el punto decimal) coincide con cualquier carácter excepto los terminadores de línea: \n, \r, \u2028 o \u2029.
Dentro de un conjunto de caracteres, el punto pierde su significado especial y coincide con un punto literal.
Tenga en cuenta que el indicador multilínea m no cambia el comportamiento de los puntos. Entonces, para hacer coincidir un patrón en varias líneas, se puede usar el conjunto de caracteres [^] (si no te refieres a una versión antigua de IE, por supuesto), coincidirá con cualquier carácter, incluidas las nuevas líneas.
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 apariciones de [^].