# Correspondance de motif

Quand vous obtenez et affectez de l’information dans l’État du Temps, il est possible d’utiliser des clés plus complexes que les symboles basiques comme `:foo`et `:bar`. Vous pouvez également utiliser des chaînes de caractères de format URL appelées chemin comme `"/foo/bar/baz"`. Lorsque nous avons commencé à travailler avec les chemins, nous pouvons commencer à prendre avantage du système sophistiqué de correspondance de motif de Sonic Pi pour `get` et `sync` des chemins “similaires” au lieu “d’identiques”. Étudions cela de plus près.

## Faire correspondre n’importe quel segment de chemin

Assumons que nous voulons attendre pour le prochain événement qui a trois segments de chemin :

    sync "/*/*/*"

Ceci va faire une correspondance avec tout événement d’État du Temps avec exactement trois segments de chemin, et ce, peu importe leur nom. Par exemple :

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

Toutefois, ça ne correspondra pas avec des chemins qui ont plus ou moins de segments. L’élément suivant n’aura pas de correspondance :

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

Chaque `*` signifie n’importe quel contenu. Donc, nous pourrions trouver des correspondance avec des chemins d’un seul segment avec `/*` ou des chemins avec cinq segments avec `/*/*/*/*/*`

## Faire des correspondances de segments partiels

Si nous savons par quoi le segment va commencer ou finir, nous pouvons utiliser un `*` en plus d’un nom de segment partiel. Par exemple : `"/foo/b*/baz"` correspondra à tout chemin possédant trois segments, le premier étant `foo`, le dernier `baz`, et celui du milieu pouvant être n’importe quoi commençant par un `b`. Il correspondra alors à :

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

Cependant, cela ne correspondrait pas avec ceci :

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

Vous pouvez également placer le `*` au début du segment pour spécifier les derniers caractères d’un segment : `"/foo/*zz/baz"` ce qui correspondra à n’importe quel triple segment `cue` ou `set` où le premier segment est `foo`, le dernier est `baz` et celui du milieu fini avec `zz` comme `"cue "/foo/whizz/baz"`.

## Faire correspondre des segments de chemins imbriqués

Parfois, vous ne connaissez pas le nombre de segments de chemin devant correspondre. Dans ce cas, vous pouvez utiliser la puissante double-étoile : `**` et ainsi `"/foo/**/baz"` correspondra à :

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

## Faire correspondre des lettres

Vous pouvez utiliser le caractère `?` pour faire une correspondance sur un seul caractère comme `"/?oo/bar/baz"` ce qui correspondra avec :

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

## Faire correspondre plusieurs mots

Si vous savez qu’un segment pourrait être un parmi un ensemble particulier de mots, vous pouvez utiliser les correspondances `{` et `}` pour spécifier une liste de choix tel que `"/foo/{bar,beans,eggs}/quux"` qui correspondra uniquement à ceci :

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

## Faire correspondre plusieurs lettres

Finalement, vous pouvez faire correspondre à une sélection de lettres si vous utilisez les correspondances `[` et `]` pour spécifier une liste de choix tel que `"/foo/[abc]ux/baz"` qui correspondra uniquement à :

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

Vous pouvez également utiliser le caractère `-` pour spécifier un ensemble de lettres. Par exemple `"/foo/[a-e]ux/baz"` qui correspondra uniquement à :

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

## Combiner des correspondances

En appelant `sync` ou `get`, vous êtes libre de combiner des correspondances dans n’importe quel ordre qui vous convient pour faire correspondre des événements d’État du Temps créés par `cue` ou `set`. Regardons un exemple fou :

    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/"

## Correspondance de motif OSC

Pour les curieux, ces règles de correspondance sont basées sur la spécification de correspondance de motif Open Sound Control, qui est expliquée en détail ici : http://opensoundcontrol.org/spec-1_0