# Pattern Matching

Al obtener y establecer información en el Estado de Tiempo, es posible utilizar claves más complejas que los símbolos básicos como `:foo` y `:bar`. También se pueden utilizar cadenas de estilo URL llamadas rutas como `"/foo/bar/baz"`. Una vez que empecemos a trabajar con rutas, podemos empezar a aprovechar el sofisticado sistema de concordancia de patrones de Sonic Pi para `get` (obtener) y `sync` (sincronizar) con rutas similares en lugar de idénticas. Echemos un vistazo.

## Match any path segment

Let’s assume we want to wait for the next event that has three path segments:

    sync "/*/*/*"

This will match any Time State event with exactly three path segments, regardless of their names. For example:

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

However, it will not match paths with fewer or more path segments. The following will not match:

- foo
- foo
- `cue "/eggs"`

Each `*` means any content. So we could match paths with just one segment with `/*` or paths with five segments with `/*/*/*/*/*`

## Matching partial segments

Si sabemos con qué va a empezar o terminar el segmento, podemos utilizar un `*` además de un nombre de segmento parcial. Por ejemplo: `"/foo/b*/baz"` coincidirá con cualquier ruta que tenga tres segmentos, el primero de los cuales es `foo`, el último `baz` y el segmento del medio puede ser cualquier cosa que empiece por `b`. Por lo tanto, coincidiría:

- foo
- foo
- foo

Sin embargo, esto no sería igual lo siguiente:

- foo
- foo
- foo

También puede colocar el `*` al principio del segmento para especificar los últimos caracteres de un segmento: `"/foo/*zz/baz"` que coincidirá con cualquier `cue` o `set` de 3 segmentos donde el primer segmento sea `foo`, el último sea `baz` y el segmento del medio termine con `zz` como `"cue "/foo/whizz/baz"`.

## Coincidiendo Segmentos de la Ruta Anidados

A veces no se sabe con cuántos segmentos de la ruta se quiere hacer coincidir. En estos casos puede utilizar la poderosa estrella doble: `**` como `"/foo/**/baz"` que coincidirá:

- foo
- foo
- foo
- foo

## Coincidiendo de a una Letra

Puedes usar el caracter `?` para coincidir un caracter en particular como por ejemplo `"/?oo/bar/baz"` coincidirá con:

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

## Coincidiendo Multiples Palabras

Si sabe que un segmento puede ser uno de un número selecto de palabras, puede utilizar los comparadores `{` y `}` para especificar una lista de opciones como `"/foo/{bar,beans,eggs}/quux"` que sólo coincidirá con lo siguiente:

- foo
- foo
- foo

## Coincidiendo Multiples Letras

Por último, puede comparar con una selección de letras si utiliza los comparadores `[` y `]` para especificar una lista de opciones como `"/foo/[abc]ux/baz"` que sólo coincidirá:

- foo
- foo
- foo

También puede utilizar el carácter `-` para especificar rangos de letras. Por ejemplo, `"/foo/[a-e]ux/baz"`, que sólo coincidirá con:

- foo
- foo
- foo
- foo
- foo

## Combinando Algoritmos de Coincidencia

Al llamar a `sync` o `get` eres libre de combinar “matchers” en el orden que consideres oportuno para hacer coincidir poderosamente cualquier evento de Time State creado por `cue` o `set`. Veamos un ejemplo muy rebuscado:

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

## Coincidencia de patrones 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