2 votes

Récupérer la chaîne de caractères comprise entre deux caractères spéciaux

J'ai une image URL dont je dois extraire l'UUID. L'URL est formée comme suit :

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

Cette URL pointe vers l'image dans mon panier, où le format de son nom est le suivant /images/[username]/[UUID] . J'ai besoin d'obtenir cet UUID afin de le supprimer pour qu'il n'occupe pas d'espace lorsque l'utilisateur télécharge une nouvelle image (qui remplace l'image existante).

J'ai essayé de tester ceci ici avec l'expression rationnelle suivante : \%([A-Z0-9-]+)\. Essentiellement, je veux extraire tout le texte compris entre un %2F et une période ( . ), où se trouve l'UUID ( 356BEDA3-E0B2-4659-9DE2-37FC8C13CDF7 ). Il a réussi à faire correspondre le modèle que je souhaitais (sous "informations de correspondance")... bien, y compris l'élément 2F qui est en fait une barre oblique échappée.

Cependant, lorsqu'on l'utilise dans Swift, il s'agit en fait de faire correspondre les caractères incluant et suivant le premier % (le résultat est %2Fj ). J'ai essayé ceci :

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

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

Note complémentaire : j'utilise cette Cadre Regex.

Quelqu'un peut-il nous expliquer pourquoi cela se produit en Swift et comment y remédier ?

2voto

Eric D. Points 16409

@rock321987 a raison, il faut échapper au point :

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

A titre d'information, cela fonctionne ainsi sans utiliser de framework tiers :

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

Impressions :

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

1voto

Wiktor Stribiżew Points 100073

Vous avez besoin du Capture :

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

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

Il convient de noter que le (...) crée un groupe de capture qui est utilisée pour obtenir des sous-chaînes plus petites à partir de vos correspondances.

A en juger par la Page Github de Sharplet Regex L'indexation des groupes de capture commence par 0 Le premier groupe de capture est donc accessible par l'intermédiaire de 0 l'index.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X