2013-01-15 30 views
5

Jak następujące kwantyfikatory różnią - w przypadku scenariuszy, prędkości, itpJakie są różnice pomiędzy leniwymi, chciwymi i zaborczymi kwantyfikatorami?

  • ?, ?? i ?+ cały mecz 0 lub 1 razy.
  • *, *? and * + `wszystko pasuje 0 lub więcej razy.
  • +, +? i ++ wszystko mecz 1 lub więcej razy.

  • ?, * i +chciwy.
  • ??, *? i +?niechętne/leniwe.
  • ?+, *+ i są dzierżawcze.

Czy ktoś może mi pomóc zrozumieć, co oznaczają te terminy? Dlaczego istnieją trzy warianty każdego kwantyfikatora dla tego samego zadania?

+2

Dlaczego? Ponieważ ktoś gdzieś ich używa? Naprawdę musisz poświęcić czas na przeczytanie dokumentów regex i wypróbować rzeczy za pomocą IRB lub rubular.com, zobaczyć, jak działają i zapamiętać, czego się nauczyłeś na przyszłość. Dużo nauki programowania to eksperymentowanie, aby obserwować efekty niewielkich zmian, nie prosząc ludzi o wyjaśnienie tych rzeczy. –

+0

http://www.regular-expressions.info/possessive.html – Phrogz

+0

@TimPietzcker dzięki tobie za głosowanie na mnie. Nie ma to dla mnie znaczenia, ale głosowanie w dół powoduje blokowanie do "nowych postów" - co wydaje mi się fatalne. Najmniej jestem powiązany z takimi głosami, ale zbyt dużo interweniowałam, gdy lubisz ludzi, którzy mają tak żywą koncepcję, mieć takie koncepcje. Ale niektórzy użytkownicy "SO" od kilku dni widzę o wiele bardziej zainteresowani "głosowaniem w dół" innych, bez znajomości znaczenia pytań. Jest OK, jeśli nie rozumiesz mojego "Posta". Ale kiedy odpowiedź zostanie zaksięgowana, a odpowiedź jest zbyt wyczerpująca, dlaczego nie powrócić do głosowania, która przegłosowała. – DoLoveSky

Odpowiedz

7

Weźmy ciąg

aaaab 

i zobaczyć, jak poniższe Wyrażenia regularne dopasować go:

Regex   Submatches 
       group 1 group 2 group3 
(a?)(a*)(ab) a  aa  ab 
(a??)(a*)(ab)   aaa  ab 
(a?+)(a*)(ab) a  aa  ab 
(a*)(a?)(ab) aaa    ab 
(a*?)(a?)(ab)   aaa  ab 
(a*+)(a?)(ab) aaaa    <Match fails!> 
(a+)(a*)(ab) aaa    ab 
(a+?)(a*)(ab) a  aa  ab 
(a++)(a*)(ab) aaaa    <Match fails!> 

Objaśnienie:

  • a? próbuje dopasować jedną a, ale jest przygotowany nic nie pasować, jeśli to konieczne cały mecz odniósł sukces.
  • a?? stara się niczego nie dopasować, ale jest gotowa dopasować jedną z nich, jeśli jest to konieczne, aby zakończyć cały mecz.
  • a?+ próbuje dopasować jeden a. Jeśli może to zrobić, to nie będzie to miało nic wspólnego z niczym, jeśli było to konieczne, aby mecz zakończył się pomyślnie. Jeśli nie może się równać z a, to z pewnością nie będzie pasować do niczego.
  • a* próbuje dopasować jak najwięcej a s, ale jest przygotowany do dopasowania mniejszej liczby a s, nawet nic jeśli to konieczne, aby cały mecz się powiódł.
  • próbuje niczego nie dopasować, ale jest przygotowany do dopasowania tak wielu, jak a s, co jest absolutnie konieczne, aby cały mecz się powiódł, ale nie więcej.
  • a*+ próbuje dopasować jak najwięcej a s jak może.Jeśli może to zrobić, będzie to , a nie z powrotem w dół, aby dopasować mniejszą liczbę a s, jeśli było to konieczne, aby ogólne dopasowanie się powiodło. Jeśli nie może się równać z pojedynczym a, to z przyjemnością nie pasuje do niczego.
  • a+ próbuje dopasować jak najwięcej a s, ale jest przygotowany do dopasowania mniejszej liczby a s (ale co najmniej jednej), jeśli jest to konieczne, aby zakończyć cały mecz.
  • a+? próbuje dopasować tylko jeden a, ale jest przygotowany do dopasowania tak wielu, jak a s, co jest absolutnie konieczne, aby cały mecz się powiódł, ale nie więcej.
  • a++ próbuje dopasować jak najwięcej a s jak może. Jeśli może to zrobić, będzie to , a nie z powrotem w dół, aby dopasować mniejszą liczbę a s, jeśli było to konieczne, aby ogólne dopasowanie się powiodło. Jeśli nie można dopasować nawet pojedynczego a, wówczas wyrażenie regularne nie działa.
+0

Wreszcie kompleksowe wyjaśnienie, które wykracza poza zwykłe "jeden lub więcej, itp.", "Chciwy/nie chciwy". Prima! – BernardK

+0

@tim Excellent! Co za wytłumaczenie, które podałeś po prostu genialnie! Uwielbiam to polubiłem! :) '+ 1' do ciebie! – DoLoveSky

+0

@DoLoveSky, Nie troll na górę głosów, proszę. Zobacz http://stackoverflow.com/faq#reputation, aby uzyskać wyjaśnienie, w jaki sposób zyskujesz reputację, nie prosząc o to. –