Expresiones regulares: coincide con cualquier cosa

280

¿Cómo hago una expresión para que coincida absolutamente con todo (incluidos los espacios en blanco)?
Ejemplo:

Regex: compré _____ ovejas.

Partidos: compré ovejas. Compré una oveja. Compré cinco ovejas.

Intenté usarlo (.*), pero eso no parece estar funcionando.

Actualización: Lo puse a trabajar, aparentemente el problema no era con las expresiones regulares, es solo que los caracteres (.) Se estaban escapando.

Caminante
fuente
27
.*Deberia trabajar. ¿Puedes pegar tu código real?
Jacob Eggers
2
¿En qué idioma estás codificando?
Ziggy
9
un punto no coincidirá con una nueva línea
zee

Respuestas:

294

Normalmente, el punto coincide con cualquier carácter, excepto las líneas nuevas .

Entonces, si .*no funciona, establezca la opción "punto coincide con las nuevas líneas también" (o use (?s).*).

Si está utilizando JavaScript, que no tiene una opción "dotall", intente [\s\S]*. Esto significa "hacer coincidir cualquier número de caracteres que son espacios en blanco o no espacios en blanco" - efectivamente "coincide con cualquier cadena".

Otra opción que solo funciona para JavaScript (y no es reconocida por ningún otro sabor de expresión regular) es la [^]*que también coincide con cualquier cadena. Pero [\s\S]*parece ser más utilizado, tal vez porque es más portátil.

Tim Pietzcker
fuente
77
.*no coincide \npero combina una cadena que contiene solo \nporque coincide con 0 caracteres.
Toto
1
si usa Javascript, no olvide recortar la barra al establecer una variable para este patrón, por ejemplo: var pattern = "[\\ s \\ S] *";
Astra Bear
las (?s).*obras para mí coincidieron con todo, incluida la nueva línea
Gujarat Santana
1
Hay un PROBLEMA con el uso de / [\ s \ S] * /. Si lo usa en su código y luego comenta dicho código que causa un error de sintaxis porque se considera que el final del patrón significa el final del comentario. Luego debe eliminar ese patrón del código comentado para que funcione. Pero luego, si alguna vez vuelves a dejar de comentarlo, ya no funcionará, o no funcionará como solía hacerlo, y debería.
Panu Logic
Este sería el caso con cualquier expresión regular que termine en un asterisco. Por supuesto, es fácil de evitar agregando algo después *(como en /.*(?:)/) o usando el constructor de expresiones regulares ( var foo = new RegExp(".*")).
Tim Pietzcker
177

(.*?) coincide con cualquier cosa, lo he estado usando durante años.

jdixon2614
fuente
61
pero eso coincide con una nueva línea?
ineedahero
Utilicé esto en Sublime Text y funcionó perfectamente. ¡Gracias! ("title":".*?")
SCabralO
8
En Javascript, use [\s\S]*o [^]*.
Jeff Huijsmans
No lo sé, pero cada vez que uso esta expresión, me siento culpable por no hacer una expresión específica para mi caso de uso. Si digo, w+no es suficiente, termino usando .+. Afortunadamente no ha vuelto a morderme todavía.
Tushar
Funciona para mí usando Python
suffa
90

Elija y memorice 1 de los siguientes !!! :)

[\s\S]*
[\w\W]*
[\d\D]*

Explicación:

\s: espacio en blanco \S: no espacio en blanco

\w: palabra \W: no palabra

\d: dígito \D: no dígito

(Puede intercambiar *por +si desea 1 o MÁS caracteres [en lugar de 0 o más]).




EDICIÓN DE BONIFICACIÓN:

Si desea hacer coincidir todo en una sola línea, puede usar esto:

[^\n]+

Explicación:

^: no

\n: salto de línea

+: para 1 personaje o más

Tyler
fuente
21

Prueba esto:

I bought (.* )?sheep

o incluso

I bought .*sheep
Mike Mozhaev
fuente
4

Porque .Encuentra un solo carácter, excepto nueva línea o terminador de línea.

Entonces, para que coincida con cualquier cosa, puede usar así: (.|\n)*?

¡Espero eso ayude!

Sang Huynh
fuente
2

(.*?)no funciona para mi Estoy tratando de hacer coincidir los comentarios rodeados /* */, que pueden contener varias líneas.

Prueba esto:

([a]|[^a])

Esta expresión regular coincide con ao anything else expect a. Absolutamente, significa hacer coincidir todo.

Por cierto, en mi situación, /\*([a]|[^a])*/coincide con los comentarios de estilo C.

Gracias @mpen por una manera más concisa.

[\s\S]
oryxfea
fuente
1
La forma más común de hacer esto en JS es [\s\S], es decir, espacios de coincidencia y no espacios.
mpen
2

Para JavaScript, la respuesta mejor y más simple parece ser /.*/.

Según lo sugerido por otros /(.*?)/ funcionaría bien pero /.*/ es más simple. Los () dentro del patrón no son necesarios, por lo que puedo ver ni el final. para que coincida absolutamente con cualquier cosa (incluidas las cadenas vacías)

NO SOLUCIONES:

/ [\ s \ S] / NO coincide con cadenas vacías, por lo que no es la solución.

/ [\ s \ S] * / CONcuerda también con cadenas vacías. Pero tiene un problema: si lo usa en su código, entonces no puede comentar dicho código porque el '* /' se interpreta como el final del comentario.

/ ([\ s \ S] *) / funciona y no tiene el problema de comentario. Pero es más largo y más complicado de entender que /.*/.

Panu Logic
fuente
Por cierto. parece que los extractos de código anteriores hacen que Stack Overflow represente partes de mi respuesta en cursiva, esa no era mi intención.
Panu Logic
1

Si está utilizando JavaScript, ES2018 agregó el indicador s (dotAll). Con la sbandera, el punto .coincidirá con cualquier carácter que incluya nuevas líneas.

console.log("line_1\nline_2".match(/.+/s))

Nota : Todavía no es compatible con algunos navegadores.

Cuong Le Ngoc
fuente
1

La especificación 2018 proporciona la bandera s (alias: dotAll), de modo que .coincida con cualquier carácter, incluidos los saltos de línea:

const regExAll = /.*/s; //notice the 's'

let str = `
Everything
	in 	this
			string
					will
						be
	matched. Including whitespace (even Linebreaks).
`;

console.log(`Match:`, regExAll.test(str)); //true
console.log(`Index Location:`, str.search(regExAll));

let newStr = str.replace(regExAll,"🐔");
console.log(`Replaced with:`,newStr); //Index: 0

El código anterior funciona en Chrome, pero la sbandera aún no está implementada en Firefox, pero lo estará pronto .

Lonnie Best
fuente
0

Recomiendo usar /(?=.*...)/g

Ejemplo

const text1 = 'I am using regex';
/(?=.*regex)/g.test(text1) // true

const text2 = 'regex is awesome';
/(?=.*regex)/g.test(text2) // true

const text3 = 'regex is util';
/(?=.*util)(?=.*regex)/g.test(text3) // true

const text4 = 'util is necessary';
/(?=.*util)(?=.*regex)/g.test(text4) // false because need regex in text

Usa regex101 para probar

Alex Montoya
fuente
0

Honestamente, muchas de las respuestas son antiguas, por lo que descubrí que si simplemente prueba cualquier cadena independientemente del contenido del carácter con "/.*/i", obtendrá TODO lo suficiente.

kjohnsonthecoder
fuente