10.3 Patroonherkenning

# Patroonherkenning

Wanneer je informatie haalt ('get') van de Time State of gegevens in de Time State vastlegd ('set'), kun je ook complexere waarden gebruiken dan de basissymbolen zoals ':foo' en ':bar'. Je kan bijvoorbeeld paden in een URL-stijl gebruiken zoals '/foo/bar/baz'. Zodra we zulke paden gaan gebruiken, kunnen we voordeel halen uit de slimme patroonherkenning van Sonic Pi, zodat we met vergelijkbare ('similar') in plaats van precies gelijke ('identical') paden kunnen halen ('get') en synchroniseren ('sync'). Laten we eens kijken.

## Komt overeen met ieder pad segment

Laten we aannemen dat wij willen wachten op een volgend event dat beschikt over drie pad segmenten:

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

Dit zal overeenkomen met ieder 'Time State' event met exact drie pad segmenten, ongeacht hun namen. Bijvoorbeeld:

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

Het zal echter niet matchen voor paden met minder of meer pad segmenten. Het volgende zal niet matchen:

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

Iedere `*` betekent *elke inhoud*. We kunnen paden matchen met slechts één segment met `/*` of paden met vijf segmenten middels `/*/*/*/*/*`

## Matcht gedeeltelijke segmenten

Als we weten waar een segment mee zal beginnen of eindigen kunnen dat deel segment samen met `*` gebruiken. Bijvoorbeeld: `"/bla/b*/baz"` zal elk pad matchen dat drie segmenten heeft waarbij het eerste `bla` en het laatste `baz` is, het middelste segment kan alles zijn dat begint met een `b`. Dus het volgende zal matchen:

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

Het zou echter niet matchen met het volgende:

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

Je kunt ook een `*` aan het begin van een segment zetten om te matchen met laatste tekens van het segment: `"/bla/*ux/baz"` welke matcht met een `cue` of `set` van 3 segmenten, waarbij het eerste `bla` en het laatste `baz` is, het middelste segment eindigd met `ux`. Zoals bijvoorbeeld:

## Matcht Geneste Pad Segmenten

Soms weet je niet uit hoeveel segmenten een pad dat je wilt matchen bestaat. In dat geval kun je gebruik maken van de krachtige dubbele asterix: `**`. Zo zal `"/bla/**/baz"` met het volgende matchen:

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

## Matcht Alleenstaande Letters

Je kunt het `?` karakter gebruiken om te matchen met een single karakter zoals `"/?oo/bar/baz"` wat zal matchen met:


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

## Matcht Met Meerdere Woorden

Als je weet dat een segment een van een select aantal woorden moet matchen kun je `{` en `}` haken gebruiken om een lijst van keuzes te geven. Zo zal `"/bla/{bar,beans,eggs}/quux"` alleen met het volgende matchen:

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

## Matcht Met Meedere Letters

Als laatste kun je ook matchen op een selectie van letters door de `[` en `]` haken te gebruiken om een lijst van keuzes aan te geven. Zo al `"/bla/[abc]ux/baz"` alleen met het volgende matchen:

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


Je kunt ook een `-` gebruiken om aan te geven dat het om een rij van letters gaat. Zo zal `"/bla/[a-e]ux/baz"` alleen matchen met:

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

## Gecombineerde Matches

Wanneer `sync` of `get` wordt aangeroepen ben je geheel vrij de `Matchers` in iedere volgorde te gebruiken met elk `Time State` event aangemaakt door `cue` of `set`. Laten we het volgende (ver gezochte) voorbeeld bekijken:

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

## OSC Patroon Matching

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
