# Сопоставление паттернов

При получении и установке информации в Time State можно использовать более сложные ключи, чем основные символы, такие как `: foo` и`: bar`. Вы также можете использовать строки в стиле URL, которые называются пути (paths), например `" / foo / bar / baz "`. Как только мы начнем работать с путями, мы сможем воспользоваться преимуществами реализованной в Sonic Pi сложной системы сопоставления паттернов для того, чтобы пользоваться функциями `get` и `sync` с похожими, а не с полностью идентичными путями. Давайте взглянем на это.

## Сопоставление любого сегмента пути

Предположим, что мы хотим дождаться следующего события, которое имеет три сегмента пути:

    sync "/*/*/*"

Это будет сопоставимо с любым событием Time State с тремя сегментами пути, независимо от их имен. Например:

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

Однако он * не будет * сопоставляться с путями с меньшим или большим количеством сегментов. Следующие пути не будут сопоставляться:

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

Каждый символ `*` означает * любой контент *. Таким образом, мы можем сопоставлять между собой пути с одним сегментом с `/ *` или пути с пятью сегментами с `/ * / * / * / * / *`

## Сопоставление частичных сегментов

Если мы знаем, с чего начинается или заканчивается сегмент, мы можем использовать `*` в дополнение к частичному имени сегмента. Например: `" / foo / b * / baz "` будет соответствовать любому пути, который имеет три сегмента, первый из которых `foo`, последний`baz`, а средний сегмент может быть любым, начинающимся с `b`. Таким образом, с этим будут сопоставимы следующие пути:

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

Однако, не будут сопоставимы следующие пути:

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

Вы также можете поместить `*` в начале сегмента, чтобы указать последние символы сегмента: `" / foo / * zz / baz "`, который будет соответствовать любым 3 сегментам `cue` или`set`, где первый сегмент - `foo`, последний -`baz`, а средний сегмент заканчивается `zz`, например`"cue" / foo / whizz / baz "`.

## Сопоставление вложенных сегментов пути

Иногда вы не знаете, сколько сегментов пути вы хотите сопоставить. В этих случаях вы можете использовать возможности двойной звезды: `**`, например `" / foo / ** / baz "`. Тогда это будет сопоставимо с:

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

## Сопоставление отдельных букв

Вы можете использовать символ `?` для сопоставления с одним символом. Например `" /? оo / bar / baz "`, что будет сопоставимо с:

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

## Сопоставление из множества слов

Если вы знаете, что сегмент может быть представлен словом из заданного набора, вы можете использовать сопоставители `{` и `}`, чтобы указать список вариантов. Например `” / foo / {bar, beans, eggs} / quux “, что может быть сопоставлено только со следующим:

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

## Сопоставление из множества букв

Наконец, вы можете сопоставить сегмент из набора букв, если используете сопоставители `[` и `]`, чтобы указать список вариантов. Например путь `" / foo / [abc] ux / baz "` будет сопоставим только с:

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

Вы также можете использовать символ `-` для указания диапазонов букв. Например, `" / foo / [a-e] ux / baz "`будет сопоставим только с:

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

## Объединение сопоставителей

При вызове `sync` или`get` вы можете комбинировать сопоставители в любом порядке, который вы считаете подходящим для сопоставления любому событию Time State, заданному с помощью `cue` или`set`. Давайте рассмотрим потрясающий пример:

    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

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