# Muster-Abgleich

Beim Holen und Setzen von Informationen unter Verwendung von Time-State lassen sich komplexere Schlüssel verwenden als einfache Symbole wie `:foo` und `:bar`. Du kannst auch Zeichenketten in der Art von URLs verwenden, wie z.B. `"/foo/bar/baz"`. Sobald wir anfangen mit Pfaden zu arbeiten, können wir auch die Vorteile des ausgeklügelten Muster-Abgleich-Systems von Sonic Pi nutzen, um `get` und `sync` mit ‘ähnlichen’ und nicht mit ‘identischen’ Pfaden zu synchronisieren. Lass uns einen Blick darauf werfen.

## Abgleich mit allen Pfad-Segmenten

Lass uns annehmen wir möchten auf das nächste Ereignis warten, das die folgenden drei Pfad-Segmente enthält:

    sync "/*/*/*"

Dieses Muster wird zu jedem Time-State-Ereignis passen, das aus exakt drei Pfadsegmenten besteht, unabhängig von deren Namen. Zum Beispiel:

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

Allerdings wird es nicht zu Ereignissen mit wenigeren oder mehr Pfad-Segmente passen. Die folgenden würden nicht passen:

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

Jeder `*` bedeutet jeder Inhalt. Das bedeutet, wir können Pfade mit nur einem Segment mit `/*` oder Pfade aus fünf Segmenten mit `/*/*/*/*/*` abgleichen

## Abgleich mit Teilsegmenten

Wenn wir wissen, womit das Segment beginnen oder enden wird, können wir ein `*` zusätzlich zum Namen eines Teilsegments verwenden. Zum Beispiel: `"/foo/b*/baz"`passt zu jedem Pfad, der drei Segmente hat, von denen das erste `foo`, das letzte `baz` und das mittlere Segment alles sein kann, was mit `b` beginnt. Also, es würde passen zu:

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

Allerdings würde es nicht zu Folgendem passen:

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

Du kannst das `*` auch an den Anfang des Segments setzen, um die letzten Zeichen eines Segments anzugeben: `"/foo/*zz/baz"`, wird zu jedem `cue` or `set` bestehend aus 3 Segmenten passen, wo das erste Segment `foo`, das letzte `baz` ist und das mittlere Segment auf `zz` endet, so wie `"cue "/foo/whizz/baz"`.

## Abgleich mit verschachtelten Pfadsegmenten

Manchmal weißt du nicht, wie viele Pfadsegmente du abgleichen möchtest. In diesen Fällen kannst du den mächtigen Doppelstern `**` verwenden, wie in `"/foo/**/**/baz"`, das übereinstimmt mit:

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

## Abgleich mit einzelnen Buchstaben

Du kannst das `?` verwenden, um mit einem beliebigen einzelnen Zeichen abzugleichen. `"/?oo/bar/baz"` passt zu:

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

## Abgleich mit mehreren Wörtern

Wenn du weißt, das ein Segment eines aus einer bestimmten Reihe von Wörtern ist, kannst du eine Auswahlliste zwischen `{` und `}` setzen, so wie `"/foo/{bar,beans,eggs}/quux"`, was nur auf das Folgende passt:

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

## Abgleich mit mehreren Zeichen

Schließlich kannst du auch noch gegen eine Auswahl von Buchstaben abgleichen, indem du eine Auswahlliste zwischen `{` und `}` setzt, so wie `"/foo/[abc]ux/baz"`, was nur passen wird zu:

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

Du kannst mit `-`auch Buchstabenbereiche angeben. Zum Beispiel `"/foo/[a-e]ux/baz"`, was nur passt zu:

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

## Kombination von Abgleichen

Wenn du `sync` oder `get` aufrufst, kannst du Abgleiche mit Mustern in beliebiger Reihenfolge miteinander kombinieren, um sehr effektiv jedes beliebige Time-State-Ereignis, das durch `cue` oder `set` erzeugt wurde, zu erkennen. Lass uns ein verrücktes Beispiel anschauen:

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

## OSC Musterabgleich

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