2016-03-20 20 views
6

Nella documentazione per la classe Java Pattern, vedo che il quantificatore esatto X{n} ha entrambe le forme avidi e riluttante:Differenza tra esatto avido/riluttante X {n}?

quantificatori Greedy

  • X {n} X, esattamente n volte
  • ...

Reluctant quanti fiers

  • X {n}? X, esattamente n volte
  • ...

La documentazione fornisce esempi generali della differenza tra il comportamento avido e riluttante, ma non fornisce alcun esempio per i quantificatori esatte.

All'inizio ho pensato, "Beh, forse la differenza è che lo stesso X potrebbe corrispondere in modi diversi." Ma allora lo X può avere i suoi specifiers greedy/riluttanti al suo interno, e abbastanza sicuro l'ho provato e questa non è una differenza (greedy vs reluctant).

Dato che, in entrambi i casi, corrisponderà esattamente a n volte, c'è qualche differenza tra il comportamento dei due?

+0

'X {2}' = 'X {2}?'. Il primo è più corto - questa è la differenza. –

risposta

5

Riluttante e goloso ha senso solo quando è possibile una corrispondenza di lunghezza variabile; un quantificatore riluttante abbinerà il minimo possibile e avidità al massimo.

Per distinguere il comportamento di una quantità limitata, è necessario disporre di un intervallo , ovvero la quantità deve avere un valore minimo e massimo diverso. Per illustrare:

Data l'ingresso 1234567, i gruppi catturati sono:

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

Quando c'è solo una quantità fissa, ad esempio \d{2} non v'è alcuna differenza nel comportamento aggiungendo una ?.

+0

Questa sembra un'ottima risposta, ma conosci qualche documentazione che la supporti? – Owen

+0

Il punto di domanda in tutti i casi indica una corrispondenza * riluttante *, che significa "il minor numero possibile di quantità precedenti ma corrisponde ancora". In questo caso, la più piccola quantità nell'intervallo di '{2,3}' che può ancora creare una corrispondenza complessiva è '2'. – Bohemian

Problemi correlati