10.3 Confrontare i Pattern

# Pattern Matching

foo

## Match any path segment

Supponiamo di voler attendere il prossimo evento che ha un percorso con tre segmenti:

```
sync "/*/*/*"
```

Questo corrisponderà a qualsiasi evento Time State con esattamente tre segmenti, questo indipendentemente dal loro nome. Per esempio:

* `cue "/foo/bar/baz"`
* `cue "/foo/baz/quux"`
* `cue "/eggs/beans/toast"`
* `cue "/moog/synths/rule"`

Tuttavia, *non* corrisponderà a percorsi con meno o più segmenti. I seguenti non corrisponderanno:

* `cue "/foo/bar"`
* `cue "/foo/baz/quux/quaax"`
* `cue "/eggs"`

Ogni `*` significa *qualsiasi contenuto*. In questo modo possiamo abbinare i percorsi con un solo segmento con `/*` oppure quelli con cinque segmenti con `/*/*/*/*/*`

## Confrontare segmenti parziali

foo

* `cue "/foo/bar/baz"`
* `cue "/foo/baz/baz"`
* `cue "/foo/beans/baz"`

Tuttavia, non corrisponderebbe a quanto segue:

* `cue "/foo/flibble/baz"`
* `cue "/foo/abaz/baz"`
* `cue "/foo/beans/baz/eggs"`

foo

## Confrontare segmenti in percorsi annidati

foo

* `cue "/foo/bar/baz"`
* `cue "/foo/bar/beans/baz"`
* `cue "/foo/baz"`
* `cue "/foo/a/b/c/d/e/f/baz"`

## Trovare corrispondenze di lettere singole

È possibile utilizzare il carattere `?` per trovare una corrispondenza con un singolo carattere, ad esempio `"/?oo/bar/baz"` che corrisponderà:


* `cue "/foo/bar/baz"`
* `cue "/goo/bar/baz"`
* `cue "/too/bar/baz"`
* `cue "/woo/bar/baz"`

## Trovare corrispondenze di parole multiple

Se sai che un segmento potrebbe essere uno di un numero selezionato di parole, puoi usare l'operatore `{` and `}` per specificare una lista di scelte come `"/foo/{bar,beans,eggs}/quux"` che troverà corrispondenza solo con:

* `cue "/foo/bar/quux"`
* `cue "/foo/beans/quux"`
* `cue "/foo/eggs/quux"`

## Trovare corrispondenze di lettere multiple

Infine, puoi cercare corrispondenze in una selezione di lettere se usi `{` and `}` per specificare una lista di scelte come ad esempio `"/foo/[abc]ux/baz"` che corrisponderà solo a:

* `cue "/foo/aux/baz"`
* `cue "/foo/bux/baz"`
* `cue "/foo/cux/baz"`


Puoi anche usare il carattere `-` per specificare un intervallo di lettere. Ad esempio `"/foo/[a-e]ux/baz"` che corrisponderà solo a:

* `cue "/foo/aux/baz"`
* `cue "/foo/bux/baz"`
* `cue "/foo/cux/baz"`
* `cue "/foo/dux/baz"`
* `cue "/foo/eux/baz"`

## Combinare corrispondenze

Nelle chiamate `sync` o `get` sei libero di combinare i parametri di confronto in qualunque ordine per intercettare qualunque evento Time State creato da `cue` o `set`. Diamo un'occhiata a un esempio inverosimile:

```
in_thread do
  sync "/?oo/[a-z]*/**/ba*/{quux,quaax}/"
  sample :loop_amen
end
sleep 1
cue "/foo/beans/a/b/c/d/e/bark/quux/"
```

## Confrontare patter OSC

For those curious, these matching rules are based on the Open Sound Control pattern matching specification which is explained in detail here: https://opensoundcontrol.stanford.edu/spec-1_0.html
