2016-04-03 15 views
6

Supponiamo che sto cercando i collegamenti di ancoraggio in una pagina web. Una regex che funziona è:La mia espressione regolare è sia pigra che avida. Perché?

"\<a\s+.*?\>" 

Tuttavia, consente di aggiungere una complicazione. Supponiamo che io voglia solo link che circondano un testo specifico, ad esempio la parola "next". Normalmente, penserei tutto quello che dovevo fare è:

"\<a\s+.*?\>next" 

ma trovo che ora, se ci sono 3 i tag di ancoraggio in una pagina, e la terza ha 'prossimo' dopo, che la ricerca regex trova una stringa enorme che si estende dal primo tag di ancoraggio e si estende fino al terzo tag di ancoraggio. Questo ha senso se il punto-asterisco-punto interrogativo sta trovando tutti i caratteri finché non incontra "> successivo". Ma non è quello che voglio. Voglio trovare tutti i caratteri finché non viene visualizzato ">", quindi un ulteriore vincolo dovrebbe essere quello subito dopo ">" dovrebbe essere "successivo".

Come posso farlo funzionare?

risposta

6

È possibile risolvere il tuo regex vietando dalla corrispondenza > all'interno del tag, vale a dire sostituendo . con [^>]:

"\<a\s+[^>]*?\>next" 

.*? corrisponde ogni numero di caratteri. Il fatto che tu l'abbia reso riluttante non lo fa fermare a >: continua a farlo incrociare, finché non trova >next alla fine. Questo non è avido, perché l'espressione corrisponde il meno possibile per ottenere una corrispondenza. È solo che non sono disponibili partite più brevi.

Demo.

Problemi correlati