Texto multilínea de expresiones regulares de JavaScript entre dos etiquetas

Resuelto asked hace 15 años • 5 respuestas

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 /mbandera.

¿Qué pasa con mi expresión regular?

 avatar Jul 01 '09 16:07
Aceptado

Está buscando el /.../smodificador, 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 sindicador (dotAll), por lo que en un entorno moderno su expresión regular podría ser tal como la escribió, pero con un sindicador al final (en lugar de m; mcambia cómo ^y $funciona, no .):

/<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/is
molf avatar Jul 01 '2009 10:07 molf

Desea el smodificador (dotall), que aparentemente no existe en Javascript; puede reemplazarlo .con [\s\S] como lo sugiere @molf. El mmodificador (multilínea) hace que ^ y $ coincidan con líneas en lugar de toda la cadena.

Greg avatar Jul 01 '2009 10:07 Greg

[\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 [^].

Michael Grant avatar Nov 15 '2017 21:11 Michael Grant