2012-08-10 24 views
191

Ho bisogno di aiuto sulla corrispondenza delle espressioni regolari con l'opzione non-golosa.Come posso scrivere una regex che corrisponde a non avidi?

Il modello è partita:

<img\s.*> 

Il testo da abbinare è:

<html> 
<img src="test"> 
abc 
<img 
    src="a" src='a' a=b> 
</html> 

I test sul http://regexpal.com

Questa espressione corrisponde a tutto il testo da <img per durare >. Ho bisogno che corrisponda al primo rilevato > dopo l'iniziale <img, quindi qui avrei bisogno di ottenere due partite invece di quella che ottengo.

Ho provato tutte le combinazioni di non-goloso ?, senza successo.

+5

In quale lingua è in esecuzione il REGEX? – Utkanos

+0

Possibile duplicato di [RegEx match open tag tranne tag XHTML autonomi] (https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

risposta

278

Il non-goloso ? funziona perfettamente. È solo che è necessario selezionare punto corrisponde a tutte le opzioni nei motori regex (regexpal, il motore utilizzato, ha anche questa opzione) con cui si sta effettuando il test. Questo perché i motori regex generalmente non corrispondono alle interruzioni di riga quando si utilizza .. È necessario dire loro esplicitamente che si desidera partita Formazione interruzioni troppo con .

Per esempio,

<img\s.*?> 

funziona bene!

Verificare il results here.

Inoltre, leggere circa how dot behaves in vari sapori regex.

+12

C'è anche un trucco che puoi fare per aggirare questo problema: Poiché \ s significa "qualsiasi spazio bianco", e "\ S" significa "qualsiasi spazio non vuoto", [\ s \ S] corrisponderà a QUALSIASI carattere (come ".", ma compresa la nuova linea)! Allo stesso modo, puoi usare [\ d \ D] o [\ w \ W].Questo può essere un piccolo "trucco" molto utile, ed è sicuramente un trucco molto utile da conoscere. –

+3

O anche, in questo esempio, è possibile utilizzare: '] *>' per ottenere lo stesso effetto: poiché "Qualsiasi carattere diverso da'> '" include la nuova riga! –

+1

buona risposta, ma che dire di bash? echo " bla " | grep -P '' corrisponde all'intera stringa nonostante il? operatore. –

47

L'operando ? rende la corrispondenza non ingorda. Per esempio. .* è goloso mentre .*? non lo è. Quindi puoi usare qualcosa come <img.*?> per abbinare l'intero tag. O <img[^>]*>.

Ma ricorda che l'intero set di HTML non può essere effettivamente analizzato con espressioni regolari.

+3

La risposta è stata ricordata a questo: http://stackoverflow.com/a/1732454/431 –

+2

Penso che sia più chiaro dire che '* ? 'è la versione non-golosa di' * '. – golopot

Problemi correlati