var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre.*?<\/pre>/gm );
alert(arr); // null
Me gustaría que el bloque PRE se recupere, aunque se extienda sobre los caracteres de nueva línea. Pensé que la bandera 'm' lo hace. No.
Encontré la respuesta aquí antes de publicar. Como pensé que conocía JavaScript (leí tres libros, trabajé horas) y no había una solución existente en SO, me atreveré a publicar de todos modos. tirar piedras aquí
Entonces 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?
Editar: este es un duplicado, pero como es más difícil de encontrar que el mío, no lo elimino.
Se propone [^]
como un "punto multilínea". Lo que aún no entiendo es por qué [.\n]
no funciona. Supongo que esta es una de las partes tristes de JavaScript.
javascript
regex
akauppi
fuente
fuente
Respuestas:
[.\n]
no funciona porque.
no tiene un significado especial en su interior[]
, solo significa un literal.
.(.|\n)
sería una forma de especificar "cualquier carácter, incluida una nueva línea". Si desea hacer coincidir todos los saltos de línea, lo que tendría que añadir\r
además para incluir Windows y terminaciones de línea clásica al estilo Mac OS:(.|[\r\n])
.Eso resulta ser algo engorroso, así como lento (vea la respuesta de KrisWebDev para más detalles ), por lo que un mejor enfoque sería hacer coincidir todos los caracteres de espacios en blanco y todos los caracteres que no son espacios en blanco, con
[\s\S]
, que coincidirá con todo, y es más rápido y más simpleEn general, no debe intentar utilizar una expresión regular para que coincida con las etiquetas HTML reales. Consulte, por ejemplo, estas preguntas 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 hacerlo
document.getElementsByTagName("pre")
con el DOM estándar), y luego busque el contenido de texto de esos resultados con una expresión regular si necesita hacer coincidir los contenidos .fuente
[\r\n]
aplicado a una secuencia \ r \ n, primero coincidiría con \ r y luego \ n. Si desea hacer coincidir toda la secuencia a la vez, independientemente de si esa secuencia es \ r \ n o simplemente \ n, use el patrón.|\r?\n
[\s\S]+
..
interior[]
es diferente a otros marcos de expresiones regulares, particularmente el avanzado en .NET. Gente, por favor no asuman que las expresiones regulares son multiplataforma, ¡con frecuencia no lo son !NO lo use en
(.|[\r\n])
lugar de.
para la coincidencia multilínea.UTILICE en
[\s\S]
lugar de.
para la coincidencia multilíneaAdemás, evite la codicia donde no sea necesario usando
*?
o un+?
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
NB: También puede usar,
[^]
pero está en desuso en el comentario a continuación.fuente
[^]
todos modos. Por un lado, JavaScript es el único sabor que conozco que respalda ese idioma, e incluso allí no se usa con tanta frecuencia como siempre[\s\S]
. Por otro lado, la mayoría de los otros sabores te permiten escapar al]
enumerarlo primero. En otras palabras, en JavaScript[^][^]
partidos cualquiera de los dos personajes, pero en .NET coincide con alguna de un carácter distinto]
,[
o^
.\S
coincidirá\r
o\n
contra algún otro personaje?[\s\S]
a otros, como[\d\D]
o[\w\W]
?/<p>Can[^]*?<\/p>/
no coincide con el mismo contenido que/<p>Can[^]*<\/p>/
. La variante codiciosa debe cambiarse para/<p>(?:[^<]|<(?!\/p>))*<\/p>/
que coincida con el mismo contenido.No especifica su entorno y versión de Javascript (ECMAscript), y me doy cuenta de que esta publicación fue de 2009, pero solo para completar, con el lanzamiento de ECMA2018 ahora podemos usar la
s
bandera para hacer.
coincidir '\ n', consulte https : //stackoverflow.com/a/36006948/141801Así:
Esta es una adición reciente y no funcionará en muchos entornos actuales, por ejemplo, el nodo v8.7.0 no parece reconocerlo, pero funciona en Chromium, y lo estoy usando en una prueba de tipografía que estoy escribiendo y presumiblemente se volverá más convencional a medida que pase el tiempo.
fuente
[.\n]
no funciona, porque el punto de entrada[]
(por definición regex; no solo javascript) significa el carácter de punto. Puedes usar(.|\n)
(o(.|[\n\r])
) en su lugar.fuente
[\s\S]
es el idioma de JavaScript más común para hacer coincidir todo, incluidas las nuevas líneas. Es más fácil a la vista y mucho más eficiente que un enfoque basado en la alternancia(.|\n)
. (Literalmente significa "cualquier personaje que sea un espacio en blanco o cualquier personaje que no sea un espacio en blanco.").
y\n
, y por qué[.\n]
no funciona. Como se mencionó en la pregunta,[^]
también es un buen enfoque.Lo he probado (Chrome) y funciona para mí (ambos
[^]
y[^\0]
), cambiando el punto (.
) por[^\0]
o[^]
porque el punto no coincide con el salto de línea (Ver aquí:http://www.regular-expressions.info/dot.html ).fuente
[^\0]
es que no coincidirá con caracteres nulos a pesar de que los caracteres nulos están permitidos en las cadenas de Javascript (ver esta respuesta ).Además de los ejemplos mencionados anteriormente, es una alternativa.
Donde
\w
es para palabras y\s
es para espacios en blancofuente