regular - javascript regex example
¿Cómo usar la expresión regular de JavaScript en varias líneas? (6)
var ss= "<pre>aaaa/nbbb/nccc</pre>ddd";
var arr= ss.match( /<pre.*?<//pre>/gm );
alert(arr); // null
Quisiera que el bloque PRE se retire, aunque se extienda sobre los caracteres de nueva línea. Pensé que la bandera ''m'' lo hace. No.
Encontré la respuesta here antes de publicar. Una vez que pensé que sabía JavaScript (leí tres libros, trabajé horas) y no existía una solución en SO, me atrevería a publicar de todos modos. tirar piedras aqui
Así que la solución es:
var ss= "<pre>aaaa/nbbb/nccc</pre>ddd";
var arr= ss.match( /<pre[/s/S]*?<//pre>/gm );
alert(arr); // <pre>...</pre> :)
¿Alguien tiene una forma menos críptica?
Edit: this es un duplicado pero como es más difícil de encontrar que el mío, no lo quito.
Propone [^]
como un "punto multilínea". Lo que todavía no entiendo es por qué [./n]
no funciona. Supongo que esta es una de las partes tristes de JavaScript ...
Además de los ejemplos mencionados anteriormente, es una alternativa.
^[//w//s]*$
Donde /w
es para palabras y /s
es para espacios en blanco
NO use (.|[/r/n])
lugar de .
para emparejamiento multilínea.
Use [/s/S]
lugar de .
para emparejamiento multilínea
Además, evite la codicia donde no sea necesario usando *?
o +?
cuantificador en lugar de *
o +
. Esto puede tener un gran impacto en el rendimiento.
Vea el punto de referencia que he hecho: http://jsperf.com/javascript-multiline-regexp-workarounds
Using [^]: fastest
Using [/s/S]: 0.83% slower
Using (.|/r|/n): 96% slower
Using (.|[/r/n]): 96% slower
NB: También puede usar [^]
pero está en desuso en el comentario a continuación.
No especifica su entorno y la versión de Javascript (ECMAscript), y me doy cuenta de que esta publicación fue de 2009, pero solo para completarla, con el lanzamiento de ECMA2018 ahora podemos usar la marca s
para causar .
para coincidir con ''/ n'', consulte https://.com/a/36006948/141801
Así:
let s = ''I am a string/nover several/nlines.'';
console.log(''String: "'' + s + ''".'');
let r = /string.*several.*lines/s; // Note ''s'' modifier
console.log(''Match? '' + r.test(s); // ''test'' returns true
Esta es una adición reciente y no funcionará en muchos entornos actuales, por ejemplo, Node v8.7.0 no parece reconocerlo, pero funciona en Chromium, y lo estoy usando en una prueba de Typescript que estoy escribiendo y, presumiblemente, se convertirá en más corriente con el tiempo.
[./n]
no funciona porque .
no tiene un significado especial dentro de []
, solo significa un literal .
. (.|/n)
sería una forma de especificar "cualquier carácter, incluida una nueva línea". Si desea hacer coincidir todas las nuevas líneas, deberá agregar también los finales de línea de estilo clásico de Windows y Mac OS: (.|[/r/n])
.
Eso resulta ser algo engorroso, además de lento, (ver la respuesta de KrisWebDev para más detalles ), por lo que un mejor enfoque sería hacer coincidir todos los caracteres de espacio en blanco y todos los caracteres que no sean espacios en blanco, con [/s/S]
, que coincidirá Todo, y es más rápido y más sencillo.
En general, no debe intentar usar una expresión regular para hacer coincidir las etiquetas HTML reales. Consulte, por ejemplo, these questions para obtener más información sobre por qué.
En su lugar, intente buscar en el DOM la etiqueta que necesita (usar jQuery lo hace más fácil, pero siempre puede hacer document.getElementsByTagName("pre")
con el DOM estándar), y luego buscar el contenido de texto de esos resultados con una expresión regular. Si necesita coincidir con los contenidos.
[./n]
no funciona, porque el punto en []
(por definición de expresión regular; no solo javascript) significa el carácter de punto. Puede usar (.|/n)
(o (.|[/n/r])
) en su lugar.