2016-05-24 4 views
2

У меня есть URL-адрес изображения, из которого мне нужно извлечь UUID. URL формируется следующим образом:Извлечь строку между двумя специальными символами

"https://firebasestorage.googleapis.com/v0/b/project-6312172760840445565.appspot.com/o/images%2Fjohn%2F356BEDA3-E0B2-4659-9DE2-37FC8C13CDF7.webp?alt=media&token=f0c16de2-c1d9-4392-8f5b-9aa5c0527ea3" 

Этот URL указывает на изображение, в моем ведре, где его формат зовут /images/[username]/[UUID]. Мне нужно получить этот UUID, чтобы удалить его, чтобы он не занимал места, когда пользователь загружает новое изображение (которое заменяет существующее).

Я попытался тестирования этого here со следующим регулярным выражением: \%([A-Z0-9-]+)\. По сути, я хочу, чтобы извлечь весь текст между %2F и периодом (.), который является, где UUID является (356BEDA3-E0B2-4659-9DE2-37FC8C13CDF7). Он успешно соответствовал шаблону, который я хотел (в разделе «информация о совпадении») ... ну, включая 2F, который на самом деле является экранированной косой чертой.

Однако при использовании его в Swift, это на самом деле соответствие символы, включая и после того, как первый % (выход %2Fj). Я попытался это:

let regex = Regex("%([A-Z0-9-]+).") 

if let match = regex.match(self.existingItem.photoURL) { 
    print(match.matchedString) 
} 

Side Примечание: Я использую this рамки Regex.

Может ли кто-нибудь пролить некоторое представление о том, почему это происходит в Свифт и как его исправить?

+0

'% ([A-Z0-9 -] +) \.' – rock321987

+0

@ rock321987 Вы правы, вы должны ответить на свое решение. – Moritz

+0

@Wiktor Stribiżew уже ответил .. не нужно добавлять избыточность – rock321987

ответ

1

Вам нужен Capture:

let reg = Regex("%2F([A-Z0-9-]+)[.]") 

if let res = reg.match(self.existingItem.photoURL)?.captures[0] { 
    print("\(res)") 
} 

Обратите внимание, что (...) создает захвата группы, который используется, чтобы получить меньшие подстроки из ваших матчей.

Судя по Sharplet Regex Github page, индексация группы захвата начинается с 0, поэтому к первой группе захвата можно получить доступ через индекс 0.

+0

Just FYI: Я использовал '[.]' Для соответствия точке, но вы можете избежать ее как '\\.' - 'let reg = Regex ("% ([A-Z0-9 -] +) \\. ") ' –

+0

Спасибо, это сработало! Мое регулярное выражение теперь фактически '% 2F ([A-Z0-9 -] +) \\.' Потому что мне нужно, чтобы он соответствовал (и игнорировал) '2F', который на самом деле является сбрасываемой косой чертой. – swiftcode

+0

Вам действительно не нужно избегать точки, если вы поместите ее в класс персонажа. Вот ссылка на статью ** [** Baskslash hell **] (https://tudorbarbu.ninja/backslash-hell/). Речь идет о PHP, но на самом деле, когда вы можете избежать обратного сбрасывания, я предпочел бы пойти на это. –

2

@ rock321987 правильно, вы должны бежать точку:

%([A-Z0-9-]+)\\. 

FWIW, она работает, как это без использования рамки третьей стороной:

if let range = text.rangeOfString("%([A-Z0-9-]+)\\.", options: .RegularExpressionSearch) { 
    let match = text.substringWithRange(range) 
    print(match) 
} 

Печать:

% 2F356BEDA3-E0B2-4659-9DE2-37FC8C13CDF7.

+0

Ваше регулярное выражение идентично моему, и вы не используете использование фреймворка OP. –

+0

@ WiktorStribiżew? Благодарю вас, я сделал свой собственный ответ на игровой площадке. Во всяком случае, я был вдохновлен комментарием rock321987, и я дал ему атрибуцию. Что касается структуры, я прямо говорю в своем ответе, что это версия * без * использования сторонней структуры для информации. – Moritz

+0

@ WiktorStribiżew Альтернативы Native Swift всегда являются ценными дополнениями к конкретным вопросам, поэтому этот ответ стоит сам по себе, даже если регулярное выражение: es одинаковое (на этот ответ сразу после вашего ответа). В другом пункте: '.captures [0]', как указано в вашем ответе (который также приведен в качестве примера на странице Gigub Sharpet Regex), действительно безопасен? I.e., мы уверены, что строковый массив '.captures' (' [String?] ') Всегда не пуст? Вместо '.captures [0]', возможно, '.captures.first' будет более подходящим выбором в разделе' if let ...'. – dfri

Смежные вопросы