检索两个特殊字符

时间:2016-05-24 19:57:14

标签: regex swift

我有一个图片网址,我需要从中提取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)
}

旁注:我正在使用this Regex框架。

任何人都可以了解一下为什么在Swift中发生这种情况以及如何解决它?

2 个答案:

答案 0 :(得分:2)

您需要捕获

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索引访问第一个捕获组。

答案 1 :(得分: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。