Espressioni regolari: abbina qualsiasi cosa


280

Come faccio a creare un'espressione per abbinare assolutamente qualsiasi cosa (compresi gli spazi bianchi)?
Esempio:

Regex: ho comprato _____ pecore.

Abbinamenti: ho comprato pecore. Ho comprato una pecora. Ho comprato cinque pecore.

Ho provato a usare (.*), ma non sembra funzionare.

Aggiornamento: L'ho fatto funzionare, a quanto pare il problema non era con le espressioni regolari, è solo che i caratteri (.) Erano in fuga.


27
.*dovrebbe funzionare. Sai incollare il tuo vero codice?
Jacob Eggers,

2
In che lingua stai codificando?
Ziggy,

9
un punto non corrisponde a una nuova riga
zee

Risposte:


294

Normalmente il punto corrisponde a qualsiasi carattere tranne le nuove linee .

Quindi, se .*non funziona, imposta l'opzione "il punto corrisponde anche alle nuove righe" (o usa (?s).*).

Se stai usando JavaScript, che non ha un'opzione "dotall", prova [\s\S]*. Questo significa "abbina un numero qualsiasi di caratteri che sono spazi bianchi o non bianchi" - in effetti "abbina qualsiasi stringa".

Un'altra opzione che funziona solo per JavaScript (e non è riconosciuta da nessun altro sapore regex) è [^]*che corrisponde anche a qualsiasi stringa. Ma [\s\S]*sembra essere più ampiamente usato, forse perché è più portatile.


7
.*non corrisponde \nma crea una stringa che contiene solo \nperché corrisponde a 0 caratteri.
Tot

1
se si utilizza Javascript, non dimenticare di tagliare la barra quando si imposta una variabile su questo modello, ad esempio: var pattern = "[\\ s \\ S] *";
Orso di Astra,

le (?s).*opere per me corrispondevano a tutto, inclusa la nuova linea
Gujarat Santana,

1
Esiste un PROBLEMA con l'utilizzo di / [\ s \ S] * /. Se lo usi nel tuo codice e poi commenti tale codice che causa un errore di sintassi perché la fine del modello è considerata la fine del commento. È quindi necessario rimuovere quel modello dal codice commentato per farlo funzionare. Ma poi, se dovessi annullare l'annotazione di nuovo, non funzionerà più, o non funzionerà come una volta, e dovrebbe.
Panu Logic,

Questo sarebbe il caso di qualsiasi regex che termina in un asterisco. Ovviamente è facile evitarlo aggiungendo qualcosa dopo *(come in /.*(?:)/) o usando il costruttore regex ( var foo = new RegExp(".*")).
Tim Pietzcker,

177

(.*?) corrisponde a tutto - lo uso da anni.


61
ma corrisponde a una nuova riga?
ineedahero,

L'ho usato su Sublime Text e ha funzionato perfettamente. Grazie! ("title":".*?")
SCabralO,

8
In Javascript, utilizzare [\s\S]*o [^]*.
Jeff Huijsmans,

Non lo so, ma ogni volta che uso questa espressione, mi sento in colpa, per non fare un'espressione specifica per il mio caso d'uso. Se dico, w+non è abbastanza, finisco per usare .+. Per fortuna non è ancora tornato a mordermi.
Tushar,

Funziona per me usando Python
suffa

90

Scegli e memorizza 1 dei seguenti !!! :)

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

Spiegazione:

\s: spazio bianco \S: non spazio bianco

\w: parola \W: non parola

\d: cifra \D: non cifra

(Puoi scambiare *per +se vuoi 1 o PIÙ caratteri [invece di 0 o più]).




BONUS EDIT:

Se vuoi abbinare tutto su una sola riga, puoi usare questo:

[^\n]+

Spiegazione:

^: no

\n: interruzione di linea

+: per 1 carattere o più




4

Perché .trova un singolo carattere, tranne la nuova riga o il terminatore di riga.

Quindi, per abbinare qualsiasi cosa, puoi usare così: (.|\n)*?

Spero che sia d'aiuto!


2

(.*?)Non funziona per me. Sto cercando di abbinare i commenti racchiusi tra loro /* */, che possono contenere più righe.

Prova questo:

([a]|[^a])

Questa regex corrisponde a ao anything else expect a. Assolutamente, significa abbinare tutto.

A proposito, nella mia situazione, /\*([a]|[^a])*/corrisponde ai commenti in stile C.

Grazie a @mpen per un modo più conciso.

[\s\S]

1
Il modo più comune per farlo in JS è [\s\S]- cioè abbinare spazi e non spazi.
Aprire l'

2

Per JavaScript la risposta migliore e più semplice sembrerebbe essere /.*/.

Come suggerito da altri /(.*?)/ funzionerebbe pure, ma /.*/ è più semplice. Il () all'interno del modello non è necessario, per quanto posso vedere né il finale? per abbinare assolutamente qualsiasi cosa (comprese le stringhe vuote)

NON-SOLUTIONS:

/ [\ s \ S] / NON corrisponde a stringhe vuote, quindi non è la soluzione.

/ [\ s \ S] * / DOES corrisponde anche a stringhe vuote. Ma ha un problema: se lo usi nel tuo codice, non puoi commentare tale codice perché "* /" viene interpretato come fine del commento.

/ ([\ s \ S] *) / funziona e non presenta il problema relativo ai commenti. Ma è più lungo e più complicato da comprendere di /.*/.


BTW. sembra che gli estratti di codice sopra riportati rendano Stack Overflow il rendering di parti della mia risposta in corsivo, che non era mia intenzione.
Panu Logic,

1

Se stai usando JavaScript, ES2018 ha aggiunto il flag s (dotAll). Con la sbandiera, il punto .corrisponderà a tutti i caratteri che includono le nuove linee.

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

Nota : non è ancora supportato in alcuni browser.


1

La specifica del 2018 fornisce il flag s (alias: dotAll), in modo che .corrisponderà a qualsiasi carattere, comprese le interruzioni di riga:

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

Il codice sopra funziona in Chrome, ma il sflag non è ancora implementato in Firefox, ma lo sarà presto .



0

Raccomando l'uso /(?=.*...)/g

Esempio

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 per testare


0

Onestamente molte delle risposte sono vecchie, quindi ho scoperto che se si prova semplicemente una stringa qualunque sia il contenuto del carattere con "/.*/i" otterrà abbastanza TUTTO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.