public function matchesUri($uri)
    {
        $regexUri = $this->uri;

        foreach ($this->getUriParameters() as $uriParameter) {
            $matchPattern = $uriParameter->getMatchPattern();
            if ('^' === $matchPattern[0]) {
                $matchPattern = \substr($matchPattern, 1);
            }

            if ('$' === \substr($matchPattern, -1)) {
                $matchPattern = \substr($matchPattern, 0, -1);
            }

            $regexUri = \str_replace(
                '/{' . $uriParameter->getKey() . '}',
                '/' . $matchPattern,
                $regexUri
            );

            $regexUri = \str_replace(
                '/~{' . $uriParameter->getKey() . '}',
                '/((' . $matchPattern . ')|())',
                $regexUri
            );
        }

        $regexUri = \preg_replace('/\/{.*}/U', '\/([^/]+)', $regexUri);
        $regexUri = \preg_replace('/\/~{.*}/U', '\/([^/]*)', $regexUri);
        // начало и конец регулярки - символ, который гарантированно не встретится
        $regexUri = \chr(128) . '^' . $regexUri . '$' . \chr(128);

        return (bool) \preg_match($regexUri, $uri);
    }