2016-03-20 19 views
6

W dokumentacji dla klasy Java Pattern, widzę, że dokładna kwantyfikator X{n} ma zarówno chciwych i niechętnie formy:Różnica między dokładnym chciwym/niechętnym X {n}?

Greedy kwantyfikatorów

  • X {n} X, dokładnie n razy
  • ...

Niechętnie kwanty fiery

  • X {n}? X dokładnie n razy
  • ...

Dokumentacja podaje ogólne przykłady różnicy między chciwy i niechętny zachowanie, ale nie daje żadnych przykładów dokładnych kwantyfikatorów.

Początkowo pomyślałem: "No cóż, może różnica polega na tym, że sama X może się dopasować na różne sposoby." Ale wtedy X może mieć w sobie własne chciwe/niechętne specyfikatory, i na pewno przetestowałem to i nie jest to żadna różnica (greedy vs reluctant).

Biorąc pod uwagę, że w obu przypadkach będzie pasować dokładnie n razy, czy jest jakaś różnica między zachowaniem dwóch?

+0

'X {2}' = 'X {2}?'. Pierwsza jest krótsza - to wszystko. –

Odpowiedz

5

Reluctant vs chciwy ma sens tylko wtedy, gdy możliwe jest dopasowanie o zmiennej długości; niechętny kwantyfikator będzie pasował do minimum możliwego i chciwy maksimum.

Aby odróżnić zachowanie ograniczonej ilości, musi mieć zakres zakres, tzn. Ilość musi mieć inne minimum i maksimum. Aby zilustrować:

Biorąc pod uwagę wejście 1234567, grupy złapanych to:

(\d{2,3})(\d+) -> (123)(4567) 
(\d{2,3}?)(\d+) -> (12)(34567) 

Gdy istnieje tylko stałą ilość, np \d{2} nie ma żadnej różnicy w zachowaniu dodając ?.

+0

To brzmi jak świetna odpowiedź, ale czy znasz jakąkolwiek dokumentację, która by ją wspierała? – Owen

+0

Znak zapytania we wszystkich przypadkach oznacza * niechętny * dopasowanie, co oznacza "jak najmniej z poprzedniej ilości, ale nadal pasuje". W tym przypadku najmniejsza ilość w zakresie '{2,3}', która może nadal tworzyć dopasowanie, to '2'. – Bohemian