10.3 Correspondance de motif

# 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

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
