2012-08-10 11 views
191

Potrzebuję pomocy w dopasowywaniu wyrażenia regularnego z opcją nieagrypcyjną.Jak mogę napisać wyrażenie regularne, które pasuje do nie chciwego?

Wzór mecz jest:

<img\s.*> 

tekst, aby dopasować to:

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

przetestować na http://regexpal.com

To wyrażenie pasuje cały tekst z <img trwać >. Potrzebuję go, aby pasował do pierwszego napotkanego > po początkowym <img, więc tutaj potrzebowałbym dwóch dopasowań zamiast tego, który dostanę.

Próbowałem wszystkich kombinacji nie-chciwych ?, bez powodzenia.

+5

W jakim języku prowadzisz REGEX? – Utkanos

+0

Prawdopodobny duplikat [otwartych tagów dopasowanych do RegEx z wyjątkiem tagów niezależnych XHTML] (https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

Odpowiedz

278

Nie-chciwy ? działa idealnie dobrze. Wystarczy, że wybierzesz opcję dot pasującą do wszystkich opcji w silnikach regex (regexpal, z której silnika korzystasz również ma tę opcję), z którą testujesz. Wynika to z tego, że silniki regex generalnie nie pasują do podziałów linii podczas korzystania z .. Trzeba im powiedzieć wprost, że chcesz dopasować line-przerwy też z .

Na przykład

<img\s.*?> 

działa dobrze!

Sprawdź numer .

Przeczytaj również o how dot behaves w różnych smakach regex.

+12

także sztuczka, którą możesz zrobić, aby obejść ten problem: Ponieważ \ s oznacza "dowolny spację", a "\ S" oznacza "dowolny nie-biały", [\ s \ S] dopasuje DOWOLNY znak (jak ".", ale w tym nowa linia)! Podobnie możesz użyć [\ d \ D] lub [\ w \ W].Może to być dość poręczny mały "hack", a na pewno bardzo przydatna sztuczka, o której warto pamiętać. –

+3

Lub nawet w tym przykładzie możesz użyć: '] *>', aby osiągnąć ten sam efekt: ponieważ "Każdy znak inny niż'> '" zawiera nową linię! –

+1

Dobra odpowiedź, ale co powiesz na bash? echo " bla " | grep -P '' dopasowuje cały ciąg mimo? operator. –

47

Argument ? powoduje, że mecz nie jest zachłanny. Na przykład. .* jest chciwy, podczas gdy .*? nie jest. Możesz więc użyć czegoś takiego, jak <img.*?>, aby dopasować cały tag. Lub <img[^>]*>.

Pamiętaj jednak, że cały zestaw HTML nie może być w rzeczywistości analizowany za pomocą wyrażeń regularnych.

+3

Twoja odpowiedź przypomniała mi o tym: http://stackoverflow.com/a/1732454/431 –

+2

Myślę, że bardziej oczywiste jest to, że '* ? 'to nie-chciwa wersja' * '. – golopot

Powiązane problemy