2013-12-09 17 views
5

mam tekst Próbuję wydobyć z LogicalID i SupplyChain zDlaczego kwantyfikator gwiazdowy jest bardziej żarłoczny niż kwantyfikator plus w wyrażeniach regularnych Java?

<LogicalID>SupplyChain</Logical> 

Na początku użyłem następujące wyrażenia regularnego:

.*([A-Za-z]+)>([A-Za-z]+)<.* 

dopasowanych następująco:

["D", "SupplyChain"] 

W desperacji próbowałem użyć gwiazdki zamiast plusa:

.*([A-Za-z]*)>([A-Za-z]+)<.* 

To idealnie pasuje.

Dokumentacja mówi, że * mecze zero lub więcej razy i + mecze jeden lub więcej razy. Dlaczego jest * chciwsza niż +?

EDYCJA: Zostało mi wskazane, że tak nie jest. Kolejność operacji wyjaśnia, dlaczego pierwsza grupa dopasowania jest rzeczywiście pusta.

+0

Co masz na myśli przez chciwego? Czy próbowałeś zmienić miejsce '. *' Z '. +'? Wygląda na to, że to nie jest chciwość, ale ważny jest tutaj porządek ich umieszczania. – Pshemo

+0

Wyglądało to jak chciwość, a to w rzeczywistości kolejność egzekucji. Znalazłem to w odpowiedzi poniżej z @Airos. – duber

+2

Umieszczenie '?' Po '*' w twoim pierwszym wyrażeniu również sprawi, że ten mecz zadziała, tj. '. *? ([A-Za-z] +)> ([A-Za-z] +) <. *' . Wskażę to tylko dlatego, że może ci pomóc zobaczyć, jak działają, ale odpowiedź @ anubhava jest prawdopodobnie lepsza, w zależności od Twoich konkretnych wymagań. – ajb

Odpowiedz

5

To nie jest różnica w chciwością. W swoim pierwszym regex:

.*([A-Za-z]+)>([A-Za-z]+)<.* 

Pytasz o dowolnej ilości znaków (.*), to przynajmniej do nas, a potem >. Tak ma być chciwy mecz D, ponieważ * pochłania wszystko przed D.

W drugim, zamiast:

.*([A-Za-z]*)>([A-Za-z]+)<.* 

Chcesz dowolną ilość znaków, a następnie dowolną ilość liter, a następnie >. Tak więc pierwsze * pochłania wszystko aż do >, a pierwsza grupa przechwytująca dopasowuje pusty ciąg. Nie sądzę, że w ogóle "pasuje idealnie".

2

Trzeba naprawdę być za pomocą tego wyrażenia regularnego:

<([A-Za-z]+)>([A-Za-z]+)< 

LUB

<([A-Za-z]*)>([A-Za-z]+)< 

Zarówno dopasuje LogicalID i SupplyChain odpowiednio.

PS: Twoje wyrażenie regularne: .*([A-Za-z]*)>([A-Za-z]+)< dopasowuje pusty ciąg jako pierwszy mecz.

Demo pracy: http://ideone.com/VMsb6n

+3

Nie sądzę, że to odpowiada na pytanie. –

+0

@kocko: Proszę wyjaśnij, dlaczego nie. Napisałem, że wyrażenie OP '. * ([A-Za-z] *)> ([A-Za-z] +) anubhava

+2

Pytanie brzmi: "Dlaczego' * 'jest chciwi niż '+'? " –

1
Why is * greedier than +? 

To nie pokazuje chciwości.

Pierwszy regex .*([A-Za-z]+)>([A-Za-z]+)<.* może być reprezentowana jako

enter image description here

Tutaj Group1 powinny muszą przedstawić jeden lub więcej razy na mecz.

a drugi .*([A-Za-z]*)>([A-Za-z]+)<.* jak

enter image description here

Tutaj Group1 powinny muszą przedstawić zero lub więcej czasu na mecz.

Powiązane problemy